python中的矩阵、多维数组----numpy
1. 引言
最近在将一个算法由matlab转成python,初学python,很多地方还不熟悉,总体感觉就是上手容易,实际上很优雅地用python还是蛮难的。目前为止,觉得就算法仿真研究而言,还是matlab用得特别舒服,可能是比较熟悉的缘故吧。matlab直接集成了很多算法工具箱,函数查询、调用、变量查询等非常方便,或许以后用久了python也会感觉很好用。与python相比,最喜欢的莫过于可以直接选中某段代码执行了,操作方便,python也可以实现,就是感觉不是很方便。
言归正传,做算法要用到很多的向量和矩阵运算操作,这些嘛在matlab里面已经很熟悉了,但用python的时候需要用一个查一个,挺烦的,所以在此稍作总结,后续使用过程中会根据使用体验更新。
python的矩阵运算主要依赖numpy包,scipy包以numpy为基础,大大扩展了后者的运算能力。
2. 创建一般的多维数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import numpy as np a = np.array([ 1 , 2 , 3 ], dtype = int ) # 创建1*3维数组 array([1,2,3]) type (a) # numpy.ndarray类型 a.shape # 维数信息(3L,) a.dtype.name # \'int32\' a.size # 元素个数:3 a.itemsize #每个元素所占用的字节数目:4 b = np.array([[ 1 , 2 , 3 ],[ 4 , 5 , 6 ]],dtype = int ) # 创建2*3维数组 array([[1,2,3],[4,5,6]]) b.shape # 维数信息(2L,3L) b.size # 元素个数:6 b.itemsize # 每个元素所占用的字节数目:4 c = np.array([[ 1 , 2 , 3 ],[ 4 , 5 , 6 ]],dtype = \'int16\' ) # 创建2*3维数组 array([[1,2,3],[4,5,6]],dtype=int16) c.shape # 维数信息(2L,3L) c.size # 元素个数:6 c.itemsize # 每个元素所占用的字节数目:2 c.ndim # 维数 d = np.array([[ 1 , 2 , 3 ],[ 4 , 5 , 6 ]],dtype = complex ) # 复数二维数组 d.itemsize # 每个元素所占用的字节数目:16 d.dtype.name # 元素类型:\'complex128\' |
3. 创建特殊类型的多维数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
a1 = np.zeros(( 3 , 4 )) # 创建3*4全零二维数组 输出: array([[ 0. , 0. , 0. , 0. ], [ 0. , 0. , 0. , 0. ], [ 0. , 0. , 0. , 0. ]]) a1.dtype.name # 元素类型:\'float64\' a1.size # 元素个数:12 a1.itemsize # 每个元素所占用的字节个数:8 a2 = np.ones(( 2 , 3 , 4 ), dtype = np.int16) # 创建2*3*4全1三维数组 a2 = np.ones(( 2 , 3 , 4 ), dtype = \'int16\' ) # 创建2*3*4全1三维数组 输出: array([[[ 1 , 1 , 1 , 1 ], [ 1 , 1 , 1 , 1 ], [ 1 , 1 , 1 , 1 ]], [[ 1 , 1 , 1 , 1 ], [ 1 , 1 , 1 , 1 ], [ 1 , 1 , 1 , 1 ]]], dtype = int16) a3 = np.empty(( 2 , 3 )) # 创建2*3的未初始化二维数组 输出:(may vary) array([[ 1. , 2. , 3. ], [ 4. , 5. , 6. ]]) a4 = np.arange( 10 , 30 , 5 ) # 初始值10,结束值:30(不包含),步长:5 输出:array([ 10 , 15 , 20 , 25 ]) a5 = np.arange( 0 , 2 , 0.3 ) # 初始值0,结束值:2(不包含),步长:0.2 输出:array([ 0. , 0.3 , 0.6 , 0.9 , 1.2 , 1.5 , 1.8 ]) from numpy import pi np.linspace( 0 , 2 , 9 ) # 初始值0,结束值:2(包含),元素个数:9 输出: array([ 0. , 0.25 , 0.5 , 0.75 , 1. , 1.25 , 1.5 , 1.75 , 2. ]) x = np.linspace( 0 , 2 * pi, 9 ) 输出: array([ 0. , 0.78539816 , 1.57079633 , 2.35619449 , 3.14159265 , 3.92699082 , 4.71238898 , 5.49778714 , 6.28318531 ]) a = np.arange( 6 ) 输出: array([ 0 , 1 , 2 , 3 , 4 , 5 ]) b = np.arange( 12 ).reshape( 4 , 3 ) 输出: array([[ 0 , 1 , 2 ], [ 3 , 4 , 5 ], [ 6 , 7 , 8 ], [ 9 , 10 , 11 ]]) c = np.arange( 24 ).reshape( 2 , 3 , 4 ) 输出: array([[[ 0 , 1 , 2 , 3 ], [ 4 , 5 , 6 , 7 ], [ 8 , 9 , 10 , 11 ]], [[ 12 , 13 , 14 , 15 ], [ 16 , 17 , 18 , 19 ], [ 20 , 21 , 22 , 23 ]]]) |
使用numpy.set_printoptions可以设置numpy变量的打印格式
在ipython环境下,使用help(numpy.set_printoptions)查询使用帮助和示例
4. 多维数组的基本操作
加法和减法操作要求操作双方的维数信息一致,均为M*N为数组方可正确执行操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
a = np.arange( 4 ) 输出: array([ 0 , 1 , 2 , 3 ]) b = a * * 2 输出: array([ 0 , 1 , 4 , 9 ]) c = 10 * np.sin(a) 输出: array([ 0. , 8.41470985 , 9.09297427 , 1.41120008 ]) n < 35 输出: array([ True , True , True , True ], dtype = bool ) A = np.array([[ 1 , 1 ],[ 0 , 1 ]]) B = np.array([[ 2 , 0 ],[ 3 , 4 ]]) C = A * B # 元素点乘 输出: array([[ 2 , 0 ], [ 0 , 4 ]]) D = A.dot(B) # 矩阵乘法 输出: array([[ 5 , 4 ], [ 3 , 4 ]]) E = np.dot(A,B) # 矩阵乘法 输出: array([[ 5 , 4 ], [ 3 , 4 ]]) |
多维数组操作过程中的类型转换
When operating with arrays of different types, the type of the resulting array corresponds to the more general or precise one (a behavior known as upcasting)
即操作不同类型的多维数组时,结果自动转换为精度更高类型的数组,即upcasting
1
2
3
4
|
a = np.ones(( 2 , 3 ),dtype = int ) # int32 b = np.random.random(( 2 , 3 )) # float64 b + = a # 正确 a + = b # 错误 |
1
2
3
4
5
6
7
8
9
10
|
a = np.ones( 3 ,dtype = np.int32) b = np.linspace( 0 ,pi, 3 ) c = a + b d = np.exp(c * 1j ) 输出: array([ 0.54030231 + 0.84147098j , - 0.84147098 + 0.54030231j , - 0.54030231 - 0.84147098j ]) d.dtype.name 输出: \'complex128\' |
多维数组的一元操作,如求和、求最小值、最大值等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
a = np.random.random(( 2 , 3 )) a. sum () a. min () a. max () b = np.arange( 12 ).reshape( 3 , 4 ) 输出: array([[ 0 , 1 , 2 , 3 ], [ 4 , 5 , 6 , 7 ], [ 8 , 9 , 10 , 11 ]]) b. sum (axis = 0 ) # 按列求和 输出: array([ 12 , 15 , 18 , 21 ]) b. sum (axis = 1 ) # 按行求和 输出: array([ 6 , 22 , 38 ]) b.cumsum(axis = 0 ) # 按列进行元素累加 输出: array([[ 0 , 1 , 2 , 3 ], [ 4 , 6 , 8 , 10 ], [ 12 , 15 , 18 , 21 ]]) b.cumsum(axis = 1 ) # 按行进行元素累加 输出: array([[ 0 , 1 , 3 , 6 ], [ 4 , 9 , 15 , 22 ], [ 8 , 17 , 27 , 38 ]]) |
universal functions
1
2
3
4
5
|
B = np.arange( 3 ) np.exp(B) np.sqrt(B) C = np.array([ 2. , - 1. , 4. ]) np.add(B,C) |
其他的ufunc函数包括:
all, any, apply_along_axis, argmax, argmin, argsort, average, bincount, ceil, clip, conj, corrcoef, cov, cross, cumprod, cumsum, diff, dot, floor,inner, lexsort, max, maximum, mean, median, min, minimum, nonzero, outer, prod, re, round, sort, std, sum, trace, transpose, var,Nump库的基本使用