1. 程式人生 > 其它 >numpy array和matrix混用

numpy array和matrix混用

技術標籤:python機器學習實戰numpypython

在numpy中存在很多的matrix和array 運算子混用的情況,程式也能通過,但這樣很不好。

matrix和array 二者運演算法則有不同,參考:https://www.jb51.net/article/142766.htm

1. 對於陣列array

就是對應位置的元素相乘:

1

2

3

4

5

X1 = np.array([[1,2], [3, 4]])

X2 = X1

print X2*X1

[[ 1 4]

[ 9 16]]

就是對應位置的相加:

1

2

3

4

5

X1 = np.array([[1,2], [

3, 4]])

X2 = X1

print X2+X1

[[2 4]

[6 8]]

2. 對於矩陣matrix

就是矩陣的點乘:

1

2

3

4

5

X1 = np.matrix([[1,2], [3, 4]])

X2 = X1

print X2*X1

[[ 7 10]

[15 22]]

有兩種情況,第一種是X1與X2的大小一致,就是普通的矩陣相加,即對應位置相加:

1

2

3

4

5

X1 = np.matrix([[1,2], [3, 4]])

X2 = X1

print X2+X1

[[2 4]

[6 8]]

第二種情況是n*1的X1 + m*1的X2(或者反過來),就會得到n*m的矩陣:

1

2

3

4

5

6

7

X1 = np.matrix([[1,2,3]])

X2 = np.matrix([[1,2,3,4]]).T

print X2+X1

[[2 3 4]

[3 4 5]

[4 5 6]

[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的哈達瑪積,或稱基本積。