2015-07-12 71 views
4

我在學習numpy,對廣播有點困惑,這裏是我的設置。我有兩個矩陣廣播如何在這個numpy的例子中應用?

>>> y=np.array([1,2,3]) 
>>> v = np.array([1,2,3]) 
>>> r=np.reshape(v, (3, 1)) 

因此r是(3 * 1)矩陣,而y是形狀爲(3,)的秩爲1的矩陣。如果我做了y.dot(r),我得到了14,假設numpy在y上應用廣播,使它成爲(1 * 3),然後用r(3 * 1)做點積,這樣得到的矩陣將是1 * 1。

但是,當我做r.dot(y)時,它會引發錯誤。它爲什麼不在這裏做同樣的事情?它應該使y(1 * 3)和r是(3 * 1),它應該給出一個3 * 3的矩陣。這個推理有什麼問題?

回答

5

正常廣播不適用於np.dot。它的文檔說:

對於N維它結束的a和 最後軸線的和積第二到最後的b ::

y(3,); r(3,1)

y*r,廣播適用,y被重塑爲(1,3),結果是(3,3)

np.dot(y,r),的y最後軸是3,的r第二最後也是3,乘和相加,形狀(1,)。請注意,如果y開始作爲(1,3),結果爲2d:

In [445]: np.dot(y.reshape(1,3),r).shape 
Out[445]: (1, 1) 

np.dot(r,y),的r最後軸是1,第二至最後y(僅)是3 - 因此不匹配。

擴大y不會產生(3,3)

In [449]: np.dot(r,y.reshape(1,3)) 
Out[449]: 
array([[1, 2, 3], 
     [2, 4, 6], 
     [3, 6, 9]]) 
2

這就像紙上的矩陣乘法,其中兩個內部維度需要一致。所以,如果你想不僅[R需要是形狀(3,1),但Ÿ必須形狀(1,3)不是一個3×3(3)

像這樣:

In [60]: r.dot(y.reshape(1,-1)) 
Out[60]: 
array([[1, 2, 3], 
     [2, 4, 6], 
     [3, 6, 9]]) 

我覺得numpy應該推斷這一點,但我猜「明確比隱含更好」