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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
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
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
|
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
5
6
7
|
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
11
12
13
14
15
16
17
18
19
|
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
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
63
64
65
66
67
|
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
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,vdot, vectorize, where
5. 数组索引、切片和迭代
1
2
3
4
5
6
7
8
9
10
11
|
a = np.arange( 10 ) * * 3
a[ 2 ]
a[ 2 : 5 ]
a[:: - 1 ] # 逆序输出
for i in a:
print (i * * ( 1 / 3. ))
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
def f(x,y):
return 10 * x + y
b = np.fromfunction(f,( 5 , 4 ),dtype = int )
b[ 2 , 3 ]
b[ 0 : 5 , 1 ]
b[:, 1 ]
b[ 1 : 3 ,:]
b[ - 1 ]
|
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
|
c = np.array([[[ 0 , 1 , 2 ],[ 10 , 11 , 12 ]],[[ 100 , 101 , 102 ],[ 110 , 111 , 112 ]]])
输出:
array([[[ 0 , 1 , 2 ],
[ 10 , 11 , 12 ]],
[[ 100 , 101 , 102 ],
[ 110 , 111 , 112 ]]])
c.shape
输出:
( 2L , 2L , 3L )
c[ 0 ,...]
c[ 0 ,:,:]
输出:
array([[ 0 , 1 , 2 ],
[ 10 , 11 , 12 ]])
c[:,:, 2 ]
c[..., 2 ]
输出:
array([[ 2 , 12 ],
[ 102 , 112 ]])
for row in c:
print (row)
for element in c.flat:
print (element)
|
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
63
64
65
66
67
68
69
70
71
72
73
|
a = np.floor( 10 * np.random.random(( 3 , 4 )))
输出:
array([[ 3. , 9. , 8. , 4. ],
[ 2. , 1. , 4. , 6. ],
[ 0. , 6. , 0. , 2. ]])
a.ravel()
输出:
array([ 3. , 9. , 8. , ..., 6. , 0. , 2. ])
a.reshape( 6 , 2 )
输出:
array([[ 3. , 9. ],
[ 8. , 4. ],
[ 2. , 1. ],
[ 4. , 6. ],
[ 0. , 6. ],
[ 0. , 2. ]])
a.T
输出:
array([[ 3. , 2. , 0. ],
[ 9. , 1. , 6. ],
[ 8. , 4. , 0. ],
[ 4. , 6. , 2. ]])
a.T.shape
输出:
( 4L , 3L )
a.resize(( 2 , 6 ))
输出:
array([[ 3. , 9. , 8. , 4. , 2. , 1. ],
[ 4. , 6. , 0. , 6. , 0. , 2. ]])
a.shape
输出:
( 2L , 6L )
a.reshape( 3 , - 1 )
输出:
array([[ 3. , 9. , 8. , 4. ],
[ 2. , 1. , 4. , 6. ],
[ 0. , 6. , 0. , 2. ]])
|
详查以下函数:
ndarray.shape, reshape, resize, ravel
6. 组合不同的多维数组
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
a = np.floor( 10 * np.random.random(( 2 , 2 )))
输出:
array([[ 5. , 2. ],
[ 6. , 2. ]])
b = np.floor( 10 * np.random.random(( 2 , 2 )))
输出:
array([[ 0. , 2. ],
[ 4. , 1. ]])
np.vstack((a,b))
输出:
array([[ 5. , 2. ],
[ 6. , 2. ],
[ 0. , 2. ],
[ 4. , 1. ]])
np.hstack((a,b))
输出:
array([[ 5. , 2. , 0. , 2. ],
[ 6. , 2. , 4. , 1. ]])
from numpy import newaxis
np.column_stack((a,b))
输出:
array([[ 5. , 2. , 0. , 2. ],
[ 6. , 2. , 4. , 1. ]])
a = np.array([ 4. , 2. ])
b = np.array([ 2. , 8. ])
a[:,newaxis]
输出:
array([[ 4. ],
[ 2. ]])
b[:,newaxis]
输出:
array([[ 2. ],
[ 8. ]])
np.column_stack((a[:,newaxis],b[:,newaxis]))
输出:
array([[ 4. , 2. ],
[ 2. , 8. ]])
np.vstack((a[:,newaxis],b[:,newaxis]))
输出:
array([[ 4. ],
[ 2. ],
[ 2. ],
[ 8. ]])
np.r_[ 1 : 4 , 0 , 4 ]
输出:
array([ 1 , 2 , 3 , 0 , 4 ])
np.c_[np.array([[ 1 , 2 , 3 ]]), 0 , 0 , 0 ,np.array([[ 4 , 5 , 6 ]])]
输出:
array([[ 1 , 2 , 3 , 0 , 0 , 0 , 4 , 5 , 6 ]])
|
详细使用请查询以下函数:
hstack, vstack, column_stack, concatenate, c_, r_
7. 将较大的多维数组分割成较小的多维数组
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
|
a = np.floor( 10 * np.random.random(( 2 , 12 )))
输出:
array([[ 9. , 7. , 9. , ..., 3. , 2. , 4. ],
[ 5. , 3. , 3. , ..., 9. , 7. , 7. ]])
np.hsplit(a, 3 )
输出:
[array([[ 9. , 7. , 9. , 6. ],
[ 5. , 3. , 3. , 1. ]]), array([[ 7. , 2. , 1. , 6. ],
[ 7. , 5. , 0. , 2. ]]), array([[ 9. , 3. , 2. , 4. ],
[ 3. , 9. , 7. , 7. ]])]
np.hsplit(a,( 3 , 4 ))
输出:
[array([[ 9. , 7. , 9. ],
[ 5. , 3. , 3. ]]), array([[ 6. ],
[ 1. ]]), array([[ 7. , 2. , 1. , ..., 3. , 2. , 4. ],
[ 7. , 5. , 0. , ..., 9. , 7. , 7. ]])]
|
实现类似功能的函数包括:
hsplit,vsplit,array_split
8. 多维数组的复制操作
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
a = np.arange( 12 )
输出:
array([ 0 , 1 , 2 , ..., 9 , 10 , 11 ])
not copy at all
b = a
b is a # True
b.shape = 3 , 4
a.shape # (3L,4L)
def f(x) # Python passes mutable objects as references, so function calls make no copy.
print ( id (x)) # id是python对象的唯一标识符
id (a) # 111833936L
id (b) # 111833936L
f(a) # 111833936L
浅复制
c = a.view()
c is a # False
c.base is a # True
c.flags.owndata # False
c.shape = 2 , 6
a.shape # (3L,4L)
c[ 0 , 4 ] = 1234
print (a)
输出:
array([[ 0 , 1 , 2 , 3 ],
[ 1234 , 5 , 6 , 7 ],
[ 8 , 9 , 10 , 11 ]])
s = a[:, 1 : 3 ]
s[:] = 10
print (a)
输出:
array([[ 0 , 10 , 10 , 3 ],
[ 1234 , 10 , 10 , 7 ],
[ 8 , 10 , 10 , 11 ]])
深复制
d = a.copy()
d is a # False
d.base is a # False
d[ 0 , 0 ] = 9999
print (a)
输出:
array([[ 0 , 10 , 10 , 3 ],
[ 1234 , 10 , 10 , 7 ],
[ 8 , 10 , 10 , 11 ]])
|
numpy基本函数和方法一览
https://docs.scipy.org/doc/numpy-dev/reference/routines.html#routines
9. 特殊的索引技巧
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
|
a = np.arange( 12 ) * * 2
输出:
array([ 0 , 1 , 4 , ..., 81 , 100 , 121 ])
i = np.array([ 1 , 1 , 3 , 8 , 5 ])
a[i]
输出:
array([ 1 , 1 , 9 , 64 , 25 ])
j = np.array([[ 3 , 4 ],[ 9 , 7 ]])
a[j]
输出:
array([[ 9 , 16 ],
[ 81 , 49 ]])
palette = np.array([[ 0 , 0 , 0 ],[ 255 , 0 , 0 ],[ 0 , 255 , 0 ],[ 0 , 0 , 255 ],[ 255 , 255 , 255 ]])
image = np.array([[ 0 , 1 , 2 , 0 ],[ 0 , 3 , 4 , 0 ]])
palette[image]
输出:
array([[[ 0 , 0 , 0 ],
[ 255 , 0 , 0 ],
[ 0 , 255 , 0 ],
[ 0 , 0 , 0 ]],
[[ 0 , 0 , 0 ],
[ 0 , 0 , 255 ],
[ 255 , 255 , 255 ],
[ 0 , 0 , 0 ]]])
i = np.array([[ 0 , 1 ],[ 1 , 2 ]])
j = np.array([[ 2 , 1 ],[ 3 , 3 ]])
a[i,j]
输出:
array([[ 2 , 5 ],
[ 7 , 11 ]])
l = [i,j]
a[l]
输出:
array([[ 2 , 5 ],
[ 7 , 11 ]])
a[i, 2 ]
输出:
array([[ 2 , 6 ],
[ 6 , 10 ]])
a[:,j]
输出:
array([[[ 2 , 1 ],
[ 3 , 3 ]],
[[ 6 , 5 ],
[ 7 , 7 ]],
[[ 10 , 9 ],
[ 11 , 11 ]]])
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
s = np.array([i,j])
print (s)
array([[[ 0 , 1 ],
[ 1 , 2 ]],
[[ 2 , 1 ],
[ 3 , 3 ]]])
a[ tuple (s)]
输出:
array([[ 2 , 5 ],
[ 7 , 11 ]])
print (tupe(s))
输出:
(array([[ 0 , 1 ],
[ 1 , 2 ]]), array([[ 2 , 1 ],
[ 3 , 3 ]]))
|
10. 寻找最大值/最小值及其对应索引值
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
|
time = np.linspace( 20 , 145 , 5 )
输出:
array([ 20. , 51.25 , 82.5 , 113.75 , 145. ])
data = np.sin(np.arange( 20 )).reshape( 5 , 4 )
输出:
array([[ 0. , 0.84147098 , 0.90929743 , 0.14112001 ],
[ - 0.7568025 , - 0.95892427 , - 0.2794155 , 0.6569866 ],
[ 0.98935825 , 0.41211849 , - 0.54402111 , - 0.99999021 ],
[ - 0.53657292 , 0.42016704 , 0.99060736 , 0.65028784 ],
[ - 0.28790332 , - 0.96139749 , - 0.75098725 , 0.14987721 ]])
ind = data.argmax(axis = 0 )
输出:
array([ 2 , 0 , 3 , 1 ], dtype = int64)
time_max = time[ind]
输出:
array([ 82.5 , 20. , 113.75 , 51.25 ])
data_max = data[ind, xrange (data.shape[ 1 ])]
输出:
array([ 0.98935825 , 0.84147098 , 0.99060736 , 0.6569866 ])
np. all (data_max = = data. max (axis = 0 ))
输出:
True
a = np.arange( 5 )
a[[ 1 , 3 , 4 ]] = 0
print (a)
输出:
array([ 0 , 0 , 2 , 0 , 0 ])
|
1
2
3
4
5
6
7
8
9
10
11
12
|
a = np.arange( 5 )
a[[ 0 , 0 , 2 ]] = [ 1 , 2 , 3 ]
print (a)
输出:
array([ 2 , 1 , 3 , 3 , 4 ])
a = np.arange( 5 )
a[[ 0 , 0 , 2 ]] + = 1
print (a)
输出:
array([ 1 , 1 , 3 , 3 , 4 ])
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
a = np.arange( 12 ).reshape( 3 , 4 )
b = a > 4
输出:
array([[ False , False , False , False ],
[ False , True , True , True ],
[ True , True , True , True ]], dtype = bool )
a[b]
输出:
array([ 5 , 6 , 7 , 8 , 9 , 10 , 11 ])
a[b] = 0
print (a)
输出:
array([[ 0 , 1 , 2 , 3 ],
[ 4 , 0 , 0 , 0 ],
[ 0 , 0 , 0 , 0 ]])
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
a = np.arange( 12 ).reshape( 3 , 4 )
b1 = np.array([ False , True , True ])
b2 = n.array([ True , False , True , False ])
a[b1,:]
输出:
array([[ 4 , 5 , 6 , 7 ],
[ 8 , 9 , 10 , 11 ]])
a[b1]
输出:
array([[ 4 , 5 , 6 , 7 ],
[ 8 , 9 , 10 , 11 ]])
a[:,b2]
输出:
array([[ 0 , 2 ],
[ 4 , 6 ],
[ 8 , 10 ]])
a[b1,b2]
输出:
array([ 4 , 10 ])
|
11. ix_() function
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
|
a = np.array([ 2 , 3 , 4 , 5 ])
b = np.array([ 8 , 5 , 4 ])
c = np.array([ 5 , 4 , 6 , 8 , 3 ])
ax,bx,cx = np.ix_(a,b,c)
print (ax) # (4L, 1L, 1L)
输出:
array([[[ 2 ]],
[[ 3 ]],
[[ 4 ]],
[[ 5 ]]])
print (bx) # (1L, 3L, 1L)
输出:
array([[[ 8 ],
[ 5 ],
[ 4 ]]])
print (cx) # (1L, 1L, 5L)
输出:
array([[[ 5 , 4 , 6 , 8 , 3 ]]])
result = ax + bx * cx
输出:
array([[[ 42 , 34 , 50 , 66 , 26 ],
[ 27 , 22 , 32 , 42 , 17 ],
[ 22 , 18 , 26 , 34 , 14 ]],
[[ 43 , 35 , 51 , 67 , 27 ],
[ 28 , 23 , 33 , 43 , 18 ],
[ 23 , 19 , 27 , 35 , 15 ]],
[[ 44 , 36 , 52 , 68 , 28 ],
[ 29 , 24 , 34 , 44 , 19 ],
[ 24 , 20 , 28 , 36 , 16 ]],
[[ 45 , 37 , 53 , 69 , 29 ],
[ 30 , 25 , 35 , 45 , 20 ],
[ 25 , 21 , 29 , 37 , 17 ]]])
result[ 3 , 2 , 4 ]
输出: 17
|
12. 线性代数运算
1
2
3
4
5
6
7
8
9
|
a = np.array([[ 1. , 2. ],[ 3. , 4. ]])
a.transpose() # 转置
np.linalg.inv(a) # 求逆
u = np.eye( 2 ) # 产生单位矩阵
np.dot(a,a) # 矩阵乘积
np.trace(a) # 求矩阵的迹
y = np.array([ 5. ],[ 7. ]])
np.linalg.solve(a,y) # 求解线性方程组
np.linalg.eig(a) # 特征分解
|
“Automatic” Reshaping
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
a = np.arange( 30 )
a.shape = 2 , - 1 , 3
a.shape # (2L, 5L, 3L)
print (a)
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 ],
[ 24 , 25 , 26 ],
[ 27 , 28 , 29 ]]])
|
1
2
3
4
5
6
7
8
9
|
x = np.arange( 0 , 10 , 2 )
y = np.arange( 5 )
m = np.vstack([x,y])
输出:
array([[ 0 , 2 , 4 , 6 , 8 ],
[ 0 , 1 , 2 , 3 , 4 ]])
n = np.hstack([x,y])
输出:
array([ 0 , 2 , 4 , 6 , 8 , 0 , 1 , 2 , 3 , 4 ])
|
13. 矩阵的创建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
a = np.array([ 1 , 2 , 3 ])
a1 = np.mat(a)
输出:
matrix([[ 1 , 2 , 3 ]])
type (a1)
输出:
numpy.matrixlib.defmatrix.matrix
a1.shape
输出:
( 1L , 3L )
a.shape
输出:
( 3L ,)
b = np.matrix([ 1 , 2 , 3 ])
输出:
matrix([[ 1 , 2 , 3 ]])
from numpy import *
data1 = mat(zeros(( 3 , 3 )))
data2 = mat(ones(( 2 , 4 )))
data3 = mat(random.rand( 2 , 2 ))
data4 = mat(random.randint( 2 , 8 ,size = ( 2 , 5 )))
data5 = mat(eye( 2 , 2 ,dtype = int ))
|
14. 常见的矩阵运算
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
|
a1 = mat([ 1 , 2 ])
a2 = mat([[ 1 ],[ 2 ]])
a3 = a1 * a2
print (a3)
输出:
matrix([[ 5 ]])
print (a1 * 2 )
输出:
matrix([[ 2 , 4 ]])
a1 = mat(eye( 2 , 2 ) * 0.5 )
print (a1.I)
输出:
matrix([[ 2. , 0. ],
[ 0. , 2. ]])
a1 = mat([[ 1 , 2 ],[ 2 , 3 ],[ 4 , 2 ]])
a1. sum (axis = 0 )
输出:
matrix([[ 7 , 7 ]])
a1. sum (axis = 1 )
输出:
matrix([[ 3 ],
[ 5 ],
[ 6 ]])
a1. max () # 求矩阵元素最大值
输出:
4
a1. min () # 求矩阵元素最小值
输出:
1
np. max (a1, 0 ) # 求矩阵每列元素最大值
输出:
matrix([[ 4 , 3 ]])
np. max (a1, 1 ) # 求矩阵每行元素最大值
输出:
matrix([[ 2 ],
[ 3 ],
[ 4 ]])
a = mat(ones(( 2 , 2 )))
b = mat(eye(( 2 )))
c = hstack((a,b))
输出:
matrix([[ 1. , 1. , 1. , 0. ],
[ 1. , 1. , 0. , 1. ]])
d = vstack((a,b))
输出:
matrix([[ 1. , 1. ],
[ 1. , 1. ],
[ 1. , 0. ],
[ 0. , 1. ]])
|
15. 矩阵、数组、列表之间的互相转换
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
|
aa = [[ 1 , 2 ],[ 3 , 4 ],[ 5 , 6 ]]
bb = array(aa)
cc = mat(bb)
cc.getA() # 矩阵转换为数组
cc.tolist() # 矩阵转换为列表
bb.tolist() # 数组转换为列表
# 当列表为一维时,情况有点特殊
aa = [ 1 , 2 , 3 , 4 ]
bb = array(aa)
输出:
array([ 1 , 2 , 3 , 4 ])
cc = mat(bb)
输出:
matrix([[ 1 , 2 , 3 , 4 ]])
cc.tolist()
输出:
[[ 1 , 2 , 3 , 4 ]]
bb.tolist()
输出:
[ 1 , 2 , 3 , 4 ]
cc.tolist()[ 0 ]
输出:
[ 1 , 2 , 3 , 4 ]
|
内容整理参考链接如下:
https://docs.scipy.org/doc/numpy-dev/user/quickstart.html
http://python.usyiyi.cn/translate/NumPy_v111/reference/arrays.scalars.html#arrays-scalars-built-in
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/xzcfightingup/p/7598293.html