一.Numpy提供两种基本的对象 ndarray和 ufunc
1.ndarray是存储单一数据类型的齐次多维数组
2.ufunc是能够对数组进行处理的函数
3.http://www.numpy.org/
二.创建数组
1.array创建数组,将元组或列表作为参数,
1 import numpy as np#引入numpy库
2 a=np.array([[1,2],[4,5,7]])#创建数组,将元组或列表作为参数
3 a2 = np.array(([1,2,3,4,5],[6,7,8,9,10]))#创建二维的narray对象
4 print(type(a))#a的类型是数组
5 print(type(a2))
6 print(a)
7 print(a2)
8 ---------------------------------------------------
9 <class 'numpy.ndarray'>
10 <class 'numpy.ndarray'>
11 [list([1, 2]) list([4, 5, 7])]
12 [[ 1 2 3 4 5]
13 [ 6 7 8 9 10]]
2.arange函数创建数组
1 import numpy as np
2 a=np.arange(12)#利用arange函数创建数组
3 print(a)
4 a2=np.arange(1,2,0.1)#arang函数和range函数相似
5 print(a2)
6 ----------------------------------------------------------
7 [ 0 1 2 3 4 5 6 7 8 9 10 11]
8 [1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9]
3.linspace用于创建指定数量等间隔的序列,实际生成一个等差数列
1 import numpy as np
2 a=np.linspace(0,1,12)#从0开始到1结束,共12个数的等差数列
3 print(a)
4 -------------------------------------------------------------------
5 [0. 0.09090909 0.18181818 0.27272727 0.36363636 0.45454545
6 0.54545455 0.63636364 0.72727273 0.81818182 0.90909091 1. ]
4.logspace用于生成等比数列
1 import numpy as np
2 a = np.logspace(0,2,5)#生成首位是10的0次方,末位是10的2次方,含5个数的等比数列
3 print(a)
4 -----------------------------------------------------------------
5 [ 1. 3.16227766 10. 31.6227766 100. ]
5.其他特殊矩阵创建方式
1 import numpy as np
2 a_ones = np.ones((3,4))# ones(N)生成一个N长度的一维全一的数组,创建3*4的全1矩阵
3 print(a_ones)#全1矩阵
4
5 a_zeros = np.zeros((3,4))#zeros(N)生成一个N长度的一维全零的数组,创建3*4的全0矩阵
6 print(a_zeros)#全0矩阵
7
8 a_eye = np.eye(3)#eye(N)创建一个N * N的单位矩阵,创建3阶单位矩阵
9 print(a_eye)#单位矩阵,等同于np.identity( N )
10
11 a_empty = np.empty((3,4))#empty(N)生成一个N长度的未初始化一维的数组,创建3*4的空矩阵
12 print(a_empty)#空矩阵(实际有值)
13 ----------------------------------------------------------------------------------
14 [[1. 1. 1. 1.]
15 [1. 1. 1. 1.]
16 [1. 1. 1. 1.]]
17 [[0. 0. 0. 0.]
18 [0. 0. 0. 0.]
19 [0. 0. 0. 0.]]
20 [[1. 0. 0.]
21 [0. 1. 0.]
22 [0. 0. 1.]]
23 [[0. 0. 0. 0.]
24 [0. 0. 0. 0.]
25 [0. 0. 0. 0.]]
6.创建数组时dtype指明单个最小元素的类型
1 #创建数组时可以用dtype指明里面单个元素的类型 2 import numpy as np 3 a=np.array([[1,2,3],[4,5,6]],dtype=int)#dtype指明里面单个元素的类型 4 print(a) 5 print(type(a)) 6 print(type(a[0])) 7 print(type(a[0][0])) 8 print('*'*30) 9 10 b=np.array([[1,2,3],[4,5,6]],dtype=str)#dtype指明里面单个元素的类型 11 print(b) 12 print(type(b)) 13 print(type(b[0])) 14 print(type(b[0][0])) 15 print('*'*30) 16 17 c=a.astype(float)#使用astype复制数组,并转换类型 18 print(c) 19 print(type(c)) 20 print(type(c[0])) 21 print(type(c[0][0])) 22 print('*'*30) 23 24 d=np.arange(6,dtype=float).reshape(2,3)#arange使用dtype时只能指明是数字的类型 25 print(d) 26 print(type(d)) 27 print(type(d[0])) 28 print(type(d[0][0])) 29 print('*'*30) 30 ---------------------------------------------------------------- 31 [[1 2 3] 32 [4 5 6]] 33 <class 'numpy.ndarray'> 34 <class 'numpy.ndarray'> 35 <class 'numpy.int32'> 36 ****************************** 37 [['1' '2' '3'] 38 ['4' '5' '6']] 39 <class 'numpy.ndarray'> 40 <class 'numpy.ndarray'> 41 <class 'numpy.str_'> 42 ****************************** 43 [[1. 2. 3.] 44 [4. 5. 6.]] 45 <class 'numpy.ndarray'> 46 <class 'numpy.ndarray'> 47 <class 'numpy.float64'> 48 ****************************** 49 [[0. 1. 2.] 50 [3. 4. 5.]] 51 <class 'numpy.ndarray'> 52 <class 'numpy.ndarray'> 53 <class 'numpy.float64'> 54 ******************************
三.查看数组
reshape方法可以更改数组的形状
1 import numpy as np#引入numpy库
2 a=np.array([[1,2],[4,5,7],3])#创建数组,将元组或列表作为参数
3 a2 = np.array(([1,2,3,4,5],[6,7,8,9,10]))#创建二维的narray对象
4 print(type(a))#a的类型是数组
5 print(a)
6 print(a2)
7 print(a.dtype)#查看a数组中每个元素的类型
8 print(a2.dtype)#查看a2数组中每个元素的类型
9 print(a.shape)#查看数组的行列,3行
10 print(a2.shape)#查看数组的行列,返回行列的元组,2行5列
11 print(a.shape[0])#查看a的行数
12 print(a2.shape[1])#查看a2的列数
13 -------------------------------------------------------------------
14 <class 'numpy.ndarray'>
15 [list([1, 2]) list([4, 5, 7]) 3]
16 [[ 1 2 3 4 5]
17 [ 6 7 8 9 10]]
18 object
19 int32
20 (3,)
21 (2, 5)
22 3
23 5
1 import numpy as np
2 a=np.array([[1,2],[4,5,7],3])
3 a2=np.array([[1,2,4],[4,5,7],[3,5,8]])
4 print(a.ndim)#获取数组的维数
5 print(a2.ndim)
6 print(a2.T)#简单转置矩阵ndarray
7 -----------------------------------------------------------------------
8 1
9 2
10 [[1 4 3]
11 [2 5 5]
12 [4 7 8]]
四.索引和切片和迭代,相似于序列
1 import numpy as np
2 a = np.array([[1,2,3,4,5],[6,7,8,9,10]])
3 print(a)
4 print(a[:])#选取全部元素
5 print(a[1])#选取行为1的全部元素
6 print(a[0:1]) #截取[0,1)的元素
7 print(a[1,2:5]) #截取第二行第[2,5)的元素[ 8 9 10]
8 print(a[1,:]) #截取第二行,返回 [ 6 7 8 9 10]
9 print(a[1,2])#截取行号为一,列号为2的元素8
10 print(a[1][2])#截取行号为一,列号为2的元素8,与上面的等价
11 #与序列索引切片相似,冒号从哪到哪,逗号分隔行列
12
13 #按条件截取
14 print(a[a>6])# 截取矩阵a中大于6的数,范围的是一维数组
15 print(a>6)#比较a中每个数和6的大小,输出值False或True
16
17 a[a>6] = 0#把矩阵a中大于6的数变成0,
18 print(a)
19 --------------------------------------------------------------
20 [[ 1 2 3 4 5]
21 [ 6 7 8 9 10]]
22 [[ 1 2 3 4 5]
23 [ 6 7 8 9 10]]
24 [ 6 7 8 9 10]
25 [[1 2 3 4 5]]
26 [ 8 9 10]
27 [ 6 7 8 9 10]
28 8
29 8
30 [ 7 8 9 10]
31 [[False False False False False]
32 [False True True True True]]
1 import numpy as np 2 a=np.arange(4,16).reshape(4,3) 3 print(a) 4 print('*'*30) 5 for i in a:#迭代数组 6 print(i,end=' ') 7 print() 8 print('*'*30) 9 for row in a:#以行迭代数组 10 print(row,end=' ') 11 print() 12 print('*'*30) 13 for column in a.T:#以列迭代数组 14 print(column,end=' ') 15 print() 16 print('*'*30) 17 print(a.flatten())#以一个列表的形式存储所有元素 18 for item in a.flat:#迭代数组的每一个元素 19 print(item,end=' ') 20 print() 21 print('*'*30) 22 ------------------------------------------------------ 23 [[ 4 5 6] 24 [ 7 8 9] 25 [10 11 12] 26 [13 14 15]] 27 ****************************** 28 [4 5 6] [7 8 9] [10 11 12] [13 14 15] 29 ****************************** 30 [4 5 6] [7 8 9] [10 11 12] [13 14 15] 31 ****************************** 32 [ 4 7 10 13] [ 5 8 11 14] [ 6 9 12 15] 33 ****************************** 34 [ 4 5 6 7 8 9 10 11 12 13 14 15] 35 [[ 4 5 6] 36 [ 7 8 9] 37 [10 11 12] 38 [13 14 15]] 39 4 5 6 7 8 9 10 11 12 13 14 15 40 ******************************
五.矩阵matrix
1 #矩阵matrix ,几乎和数组一样,
2 import numpy as np
3 a=np.matrix([[1,2,3],[2,6,4]])
4 print(a)
5 a2=np.matrix([1,2,3,4,5,3,4,6,2,4,6])
6 print(a2)
7 --------------------------------------------------------
8 [[1 2 3]
9 [2 6 4]]
10 [[1 2 3 4 5 3 4 6 2 4 6]]
六.矩阵的合并hstack和vstack
1 import numpy as np
2 a1 = np.array([[1,2],[3,4]])
3 a2 = np.array([[5,6],[7,8]])
4
5 #!注意 参数传入时要以列表list或元组tuple的形式传入
6 print(np.hstack([a1,a2]))
7 #横向合并,np.concatenate( (a1,a2), axis=1)等价于np.hstack( (a1,a2) )
8
9 print(np.vstack((a1,a2)))
10 #纵向合并,np.concatenate( (a1,a2), axis=0)等价于np.vstack( (a1,a2) )
11 ----------------------------------------------------
12 [[1 2 5 6]
13 [3 4 7 8]]
14 [[1 2]
15 [3 4]
16 [5 6]
17 [7 8]]
七.矩阵运算
1 import numpy as np
2 import numpy.linalg as lg#求矩阵的逆需要先导入numpy.linalg
3 a1 = np.array([[1,2,3],[4,5,6],[2,4,5]])
4 a2 = np.array([[1,2,4],[3,4,8],[8,5,6]])
5 print(a1+a2) # 相加
6 print(a1-a2) # 相减
7 print(a1/a2) # 对应元素相除,如果都是整数则取商
8 print(a1%a2) # 对应元素相除后取余数
9 print(a1**2) # 矩阵每个元素都取n次方
10 print(a1.dot(a2))#点乘满足:第一个矩阵的列数等于第二个矩阵的行数
11 print(a1.transpose())#转置等价于print(a1.T)
12
13 # 用linalg的inv函数来求逆
14 print(lg.inv(a1))#求逆
15 ---------------------------------------------
16 [[ 2 4 7]
17 [ 7 9 14]
18 [10 9 11]]
19 [[ 0 0 -1]
20 [ 1 1 -2]
21 [-6 -1 -1]]
22 [[1. 1. 0.75 ]
23 [1.33333333 1.25 0.75 ]
24 [0.25 0.8 0.83333333]]
25 [[0 0 3]
26 [1 1 6]
27 [2 4 5]]
28 [[ 1 4 9]
29 [16 25 36]
30 [ 4 16 25]]
31 [[31 25 38]
32 [67 58 92]
33 [54 45 70]]
34 [[1 4 2]
35 [2 5 4]
36 [3 6 5]]
37 [[ 0.33333333 0.66666667 -1. ]
38 [-2.66666667 -0.33333333 2. ]
39 [ 2. 0. -1. ]]
八.处理矩阵
1 import numpy as np
2 a = np.array([[1,2,3],[4,5,6]])
3 print(a.max()) #获取整个矩阵的最大值 结果: 6
4 print(a.min()) #结果:1
5 print(a.max(axis=0))#获得每列的最大(小)值
6 print(a.max(axis=1))#获得每行的最大(小)值
7 print(a.argmax(axis=1))# 要想获得最大最小值元素所在的位置,可以通过argmax函数来获得
8 print(a.mean())#元素的平均值
9 print(a.mean(axis=0))#每列平均值
10 print(a.mean(axis=1))#每行平均值
11 print(a.var())#方差相当于函数mean(abs(x - x.mean())**2)
12 print(a.std())#标准差相当于sqrt(mean(abs(x - x.mean())**2))
13 print(np.median(a))# 对所有数取中值
14 print(np.median(a,axis=0))# 列方向取中值
15 print(a.sum())# 对整个矩阵求和
16 print(a.cumsum())#对整个矩阵求累积和,某位置累积和指的是该位置之前(包括该位置)所有元素的和
17 --------------------------------------------------------------
18 6
19 1
20 [4 5 6]
21 [3 6]
22 [2 2]
23 3.5
24 [2.5 3.5 4.5]
25 [2. 5.]
26 2.9166666666666665
27 1.707825127659933
28 3.5
29 [2.5 3.5 4.5]
30 21
31 [ 1 3 6 10 15 21]
九.分割
1 import numpy as np 2 a=np.arange(12).reshape(3,4) 3 print(a) 4 5 print(np.split(a,2,axis=1))#对a进行分割成2块,以列方向进行操作 6 print(np.split(a,3,axis=0))#对a进行分割成3块,以行方向进行操作 7 # print(np.split(a,2,axis=0))array split does not result in an equal division 8 #split分割只能进行相等的分割 9 10 print(np.array_split(a,2,axis=0)) 11 #array_split进行不等分割 12 13 print(np.vsplit(a,3))#纵向分割 14 print(np.hsplit(a,3))#横向分割 15 ---------------------------------------------------------- 16 [[ 0 1 2 3] 17 [ 4 5 6 7] 18 [ 8 9 10 11]] 19 [array([[0, 1], 20 [4, 5], 21 [8, 9]]), 22 array([[ 2, 3], 23 [ 6, 7], 24 [10, 11]])] 25 [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])] 26 [array([[0, 1, 2, 3], [4, 5, 6, 7]]), 27 array([[ 8, 9, 10, 11]])] 28 [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
十.复制
1 import numpy as np 2 a=np.arange(6) 3 print(a) 4 b=a 5 c=a 6 d=b 7 print(b is a) 8 print(id(a),id(b),id(c),id(d)) 9 10 e=a.copy() 11 print(id(e)) 12 ---------------------------------------------- 13 [0 1 2 3 4 5] 14 True 15 82754520 82754520 82754520 82754520 16 82754560
复制
十一.补充
1 import numpy as np 2 a = np.array([[1,2,3],[4,5,6]]) 3 print(a) 4 print(type(a)) 5 b=np.arange(12) 6 print(type(b)) 7 d=np.empty(3) 8 print(type(d)) 9 #一般创建的都是数组类型,多维数组可以被看做一个矩阵 10 11 e=np.matrix([[1,2,3],[4,5,6]])#class matrix(N.ndarray) 12 print(e) 13 print(type(e)) 14 #专门的矩阵类继承矩阵类型 15 ------------------------------------------------ 16 [[1 2 3] 17 [4 5 6]] 18 <class 'numpy.ndarray'> 19 <class 'numpy.ndarray'> 20 <class 'numpy.ndarray'> 21 [[1 2 3] 22 [4 5 6]] 23 <class 'numpy.matrixlib.defmatrix.matrix'>