numpy array和matrix混用
在numpy中存在很多的matrix和array 運算子混用的情況,程式也能通過,但這樣很不好。
matrix和array 二者運演算法則有不同,參考:https://www.jb51.net/article/142766.htm
1. 對於陣列array
乘
就是對應位置的元素相乘:
1 2 3 4 5 |
|
加
就是對應位置的相加:
1 2 3 4 5 |
3 , 4 ]])
|
2. 對於矩陣matrix
乘
就是矩陣的點乘:
1 2 3 4 5 |
|
加
有兩種情況,第一種是X1與X2的大小一致,就是普通的矩陣相加,即對應位置相加:
1 2 3 4 5 |
|
第二種情況是n*1的X1 + m*1的X2(或者反過來),就會得到n*m的矩陣:
1 2 3 4 5 6 7 |
|
3. 混用情況
在numpy中存在很多的matrix和array 運算子混用的情況,程式也能通過,但這樣很不好,儘量按照以上原則使用。
如果2維的array想要進行矩陣的點乘運算,可以用np.dot(X1, X2)
如果matrix想要進行對應位置的乘,可以用np.multiply(X2,X1)
來試驗一下混用會出現什麼結果。
import numpy as np A=np.mat([[1,2],[3,4]]) x=np.ones((2,1)) x Out[13]: array([[1.], [1.]]) A Out[14]: matrix([[1, 2], [3, 4]]) x.shape Out[15]: (2, 1) A.shape Out[16]: (2, 2) A*x Out[17]: matrix([[3.], [7.]]) B=np.array([[1,2],[3,3]]) B*x Out[19]: array([[1., 2.], [3., 3.]]) A*x Out[20]: matrix([[3.], [7.]]) A*B Out[21]: matrix([[ 7, 8], [15, 18]]) B*A Out[22]: matrix([[ 7, 10], [12, 18]]) C=np.array([[1,5],[2,7]]) C Out[24]: array([[1, 5], [2, 7]]) B*C Out[25]: array([[ 1, 10], [ 6, 21]]) C*B Out[26]: array([[ 1, 10], [ 6, 21]]) z=np.array([[2],[3]]) z.shape Out[36]: (2, 1) z Out[37]: array([[2], [3]]) A*z Out[38]: matrix([[ 8], [18]]) B*z Out[39]: array([[2, 4], [9, 9]])
因此:
A:2x2 matrix
B:2x2 array, C:2x2 array , x:2x1 array
(1)2x2 array和matrix用*相乘,計算的是矩陣點乘,結果與前後順序有關。A*B != B*A
(2)兩個2x2array用*相乘,計算的是對應位置相乘(哈達瑪積),結果與前後順序無關。B*C==C*B
(3)一個2x2matrix和2x1array用*相乘,計算的是矩陣點乘。A*z , A*x
(4)一個2x2array和2x1array用*相乘,計算的是2x2array每行對應乘2x1array相應行的元素,行向量對應乘元素。B*z , B*x
初步總結:有matrix,* 就按點乘算,按matrix規則來。(若不對請指正!)
附:哈達瑪積(來源:百度百科)
哈達瑪積(Hadamard product)是矩陣的一類運算,若A=(aij)和B=(bij)是兩個同階矩陣,若cij=aij×bij,則稱矩陣C=(cij)為A和B的哈達瑪積,或稱基本積。