2012-11-08 36 views
2

假設我有三個數組(即numpy.array類型):numpy的陣列乘法問題

>>> w.shape 
(113,) 
>>> X.shape 
(113,1) 
>>> Y.shape 
(113,) 

的numpy的幫助頁面建議在陣列的每個乘法逐元素。由於所有上述三種載體在第一維尺寸113,我想乘法將在所有情況下得到113長度矢量,但它並不:

>>> (w * Y).shape  # expected 
(113,) 
>>> (w * X).shape  # ?!?!?!?! 
(113,113) 

哪裏在第二軸線113來自?對我來說,看起來不那麼明智。

回答

3

當在兩個陣列上操作時,NumPy比較它們的形狀,其元素爲 。它以尾隨尺寸開始,並且向前推進。兩個維度是兼容當它們相等時,或它們中的一個是 1.

兩個軸的較小的拉伸或「複製」,以匹配 另一個。

Numpy的broadcasting規則正在這裏應用。

w  (1d array):  113 
X  (2d array): 113 x 1 
Result (2d array): 113 x 113 
+0

啊哈,「打頭的*** ***尾隨尺寸」!謝謝。 – Paul

+0

如果你想把'(N,1)'與'y(N,1)'乘法的結果'',使用'x [:,None] * y'強制廣播。 –

0

,看看發生了什麼事情是用一個例子最簡單的方法:

w = array([5,6]) 
x = array([[1,2],[3,4]]) 
z = array([[5,6]]) 

w*x 
# array([[ 5, 12], 
#  [15, 24]]) 

w*z 
# array([[25, 36]])