2013-04-03 274 views
9

我有一個操作結果的問題,我偶然用兩個numpy矩陣執行(後來修復)。假設我有一個列向量,A = [1,2,3],行向量B = [1,1,1]。據我所知,沒有正確的數學方法來「減去」這兩個向量,即這應該是一個未定義的操作。然而,當我這樣做,我得到的結果:Numpy矩陣減法混淆

>>> matrix([[0, 1, 2], 
      [0, 1, 2], 
      [0, 1, 2]]) 

我認爲這可能是某種廣播操作,但仍困擾我有點。不應該numpy.matrix對象只包含數學上有效的矩陣操作?

任何幫助表示讚賞!

謝謝!

+0

這將是有趣的知道。 – Ivan 2013-04-03 19:21:56

+0

谷歌「numpy廣播」 – user1149913 2013-04-03 19:37:25

+2

@ user1149913我相信問題不是廣播是如何工作的,而是爲什麼一行允許使用列向量加/減?此外,請記住,廣播規則對於'np.matrix'與'np.ndarray'大不相同。 – askewchan 2013-04-03 19:39:03

回答

2

A和B正在一起播出:

A = np.matrix([[1],[2],[3]]) 
#a 3x1 vector 
#1 
#2 
#3 

B = np.matrix([[1,1,1]]) 
#a 1x3 vector 
#1 1 1 

A-B 
#a 3x3 vector 
#0 0 0 
#1 1 1 
#2 2 2 

A獲得沿其大小1維(列)廣播到

#1 1 1 
#2 2 2 
#3 3 3 

乙沿其大小1尺寸(行)獲得廣播到

#1 1 1 
#1 1 1 
#1 1 1 

然後AB被計算爲通常的兩3x3矩陣。

如果你想知道爲什麼它這樣做,而不是報告錯誤,這是因爲np.matrix繼承自np.array。 np.matrix覆蓋乘法,但不包括加法和減法,所以它使用基於np.array的操作,該操作在維度允許時進行廣播。

+1

但是你必須小心誰使用這個。數學家和物理學家不一定會知道這一點(即使它可以告訴你一個快速的谷歌),並會認爲這應該返回一個錯誤,當它顯然沒有。在我看來,np.matrix也應該重寫加法和減法。這是我們在這裏討論的數學庫。 – astromax 2013-04-03 22:12:14

+3

我同意astromax。在處理矩陣對象時,我認爲最好是拋出錯誤或異常,而不是執行意外的操作。 Matlab得到這個權利 – kith 2013-04-04 02:50:58

0

我無法真正解釋原因,因爲我經常使用np.matrix而不是np.array來防止這種情況。感謝上面評論中的@ Jaime的鏈接,很顯然np.matrix僅僅是np.ndarray的一個子類,具有重新定義的中綴操作,其中有來自線性代數的適當答案。如果沒有,則從np.ndarrayndim = 2的規則回落。

似乎除了遵循從A元素搭配的元素從B矩陣乘法法則

In [1]: import numpy as np 
In [2]: A = np.matrix([1,2,3]).T 
In [3]: B = np.matrix([1,1,1]) 

In [4]: A 
Out[4]: 
matrix([[1], 
     [2], 
     [3]]) 

In [5]: B 
Out[5]: matrix([[1, 1, 1]]) 

In [6]: A+B 
Out[6]: 
matrix([[2, 2, 2], 
     [3, 3, 3], 
     [4, 4, 4]]) 

In [7]: A*B 
Out[7]: 
matrix([[1, 1, 1], 
     [2, 2, 2], 
     [3, 3, 3]]) 

這是你np.array獲得相同的行爲:

In [9]: a = np.arange(3)[...,None] 

In [10]: b = np.arange(3) 

In [11]: a 
Out[11]: 
array([[0], 
     [1], 
     [2]]) 

In [12]: b 
Out[12]: array([0, 1, 2]) 

In [13]: a+b 
Out[13]: 
array([[0, 1, 2], 
     [1, 2, 3], 
     [2, 3, 4]])