matrix是array的一个小的分支,包含于array。所以matrix 拥有array的所有特性。
但在数组乘和矩阵乘时,两者各有不同,如果a和b是两个matrices,那么a*b,就是矩阵积
如果a,b是数组的话,则a*b是数组的运算
1.对数组的操作
1
|
>>> import numpy as np |
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
|
>>> a = np.array([[ 1 , 2 , 3 ],[ 4 , 5 , 6 ],[ 7 , 8 , 9 ]]) >>> a array([[ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ]]) >>> b = a.copy() >>> b array([[ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ]]) >>> a + b #多维数组的加减,按对应位置操作 array([[ 2 , 4 , 6 ], [ 8 , 10 , 12 ], [ 14 , 16 , 18 ]]) >>> a * 3 #多维数组乘常数,则对数组中每一个元素乘该常数 array([[ 3 , 6 , 9 ], [ 12 , 15 , 18 ], [ 21 , 24 , 27 ]]) >>> np.dot(a,b) #数组的点乘运算通过np.dot(a,b)来实现,相当于矩阵乘 array([[ 30 , 36 , 42 ], [ 66 , 81 , 96 ], [ 102 , 126 , 150 ]]) >>> c = np.array([ 1 , 2 , 3 ]) #构造一行三列的数组 >>> c array([ 1 , 2 , 3 ]) >>> c * a #c为一行三列,放于数组a之前,则对数组a中每行对应位置相乘 array([[ 1 , 4 , 9 ], [ 4 , 10 , 18 ], [ 7 , 16 , 27 ]]) >>> a * c #c为一行三列,放于数组a之后,依旧是对数组a中每行对应位置相乘 array([[ 1 , 4 , 9 ], [ 4 , 10 , 18 ], [ 7 , 16 , 27 ]]) >>> #如果想要矩阵运算,则需要np.dot()函数 >>> np.dot(c,a) #c为一行三列,放于数组a之前,按正常矩阵方式运算 array([ 30 , 36 , 42 ]) >>> np.dot(a,c) #c为一行三列,放于数组a之后,相当于矩阵a乘以3行一列的c矩阵,返回结果值不变,格式为1行3列 array([ 14 , 32 , 50 ]) >>> #将c改为多行一列的形式 >>> d = c.reshape( 3 , 1 ) >>> d array([[ 1 ], [ 2 ], [ 3 ]]) >>> # >>> np.dot(a,d) #值与np.dot(a,c)一致,但格式以改变为3行1列 array([[ 14 ], [ 32 ], [ 50 ]]) >>> a * a #数组使用*的运算其结果属于数组运算,对应位置元素之间的运算 array([[ 1 , 4 , 9 ], [ 16 , 25 , 36 ], [ 49 , 64 , 81 ]]) >>> #但是不能更改a,d点乘的位置,不符合矩阵运算格式 >>> np.dot(d,a) traceback (most recent call last): file "<pyshell#28>" , line 1 , in <module> np.dot(d,a) valueerror: shapes ( 3 , 1 ) and ( 3 , 3 ) not aligned: 1 (dim 1 ) ! = 3 (dim 0 ) |
对于数组的转置,求逆,求迹运算请参考上篇文章
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
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
|
>>> a = np.array([[ 1 , 2 , 3 ],[ 4 , 5 , 6 ],[ 7 , 8 , 9 ]]) >>> a = np.mat(a) >>> a matrix([[ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ]]) >>> b = a >>> b matrix([[ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ]]) >>> a + b #矩阵的加减运算和数组运算一致 matrix([[ 2 , 4 , 6 ], [ 8 , 10 , 12 ], [ 14 , 16 , 18 ]]) >>> a - b matrix([[ 0 , 0 , 0 ], [ 0 , 0 , 0 ], [ 0 , 0 , 0 ]]) >>> a * b #矩阵的乘用*即可表示 matrix([[ 30 , 36 , 42 ], [ 66 , 81 , 96 ], [ 102 , 126 , 150 ]]) >>> np.dot(a,b) #与*一致 matrix([[ 30 , 36 , 42 ], [ 66 , 81 , 96 ], [ 102 , 126 , 150 ]]) >>> b * a matrix([[ 30 , 36 , 42 ], [ 66 , 81 , 96 ], [ 102 , 126 , 150 ]]) >>> np.dot(b,a) matrix([[ 30 , 36 , 42 ], [ 66 , 81 , 96 ], [ 102 , 126 , 150 ]]) >>> c = np.array([ 1 , 2 , 3 ]) #构造一行三列数组 >>> c array([ 1 , 2 , 3 ]) >>> c * a #矩阵运算 matrix([[ 30 , 36 , 42 ]]) >>> a * c #不合矩阵规则 traceback (most recent call last): file "<pyshell#63>" , line 1 , in <module> a * c file "f:\python3\anzhuang\lib\site-packages\numpy\matrixlib\defmatrix.py" , line 309 , in __mul__ return n.dot( self , asmatrix(other)) valueerror: shapes ( 3 , 3 ) and ( 1 , 3 ) not aligned: 3 (dim 1 ) ! = 1 (dim 0 ) >>> np.dot(c,a) #和矩阵运算一致 matrix([[ 30 , 36 , 42 ]]) >>> np.dot(a,c) #自动将a转换成3行1列参与运算,返回结果格式已经变为1行3列而非3行一列的矩阵 matrix([[ 14 , 32 , 50 ]]) >>> c = c.reshape( 3 , 1 ) >>> c array([[ 1 ], [ 2 ], [ 3 ]]) >>> a * c #和矩阵运算一致 matrix([[ 14 ], [ 32 ], [ 50 ]]) >>> c * a #不合矩阵运算格式 traceback (most recent call last): file "<pyshell#71>" , line 1 , in <module> c * a valueerror: shapes ( 3 , 1 ) and ( 3 , 3 ) not aligned: 1 (dim 1 ) ! = 3 (dim 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
|
>>> a matrix([[ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ]]) >>> a.t matrix([[ 1 , 4 , 7 ], [ 2 , 5 , 8 ], [ 3 , 6 , 9 ]]) >>> a.h #共轭转置 matrix([[ 1 , 4 , 7 ], [ 2 , 5 , 8 ], [ 3 , 6 , 9 ]]) >>> b = np.eye( 3 ) * 3 >>> b array([[ 3. , 0. , 0. ], [ 0. , 3. , 0. ], [ 0. , 0. , 3. ]]) >>> b = np.mat(b) >>> b.i #求逆运算 matrix([[ 0.33333333 , 0. , 0. ], [ 0. , 0.33333333 , 0. ], [ 0. , 0. , 0.33333333 ]]) >>> np.trace(b) #求迹运算 9.0 |
以上所述是小编给大家介绍的python中数组和矩阵乘法及使用总结详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:https://blog.csdn.net/manjhOK/article/details/80017892