2017-06-21 64 views
0

我有兩個numpy的數組:當使用*約numpy.array和numpy.matrix

a = np.array([1, 2, 3]).reshape(3, 1) 
b = np.array([4, 5]).reshape(2,1) 

當我使用a*b.T,我想到的是一個錯誤的輸出,因爲在它們的形狀的差異(使用*執行數組的元素乘法)。 但結果收益矩陣乘法,如:

[[ 4, 5], 
[ 8, 10], 
[12, 15]] 

# this shape is (3, 2) 

爲什麼它的工作原理是這樣?

+1

如果您已將a重新組合爲(3,1),並將b重新組合爲(2,1)。然後a * b.T應該導致(3,2)。 'a * b.T〜=(3,1)*(1,2)'。內部尺寸匹配。所以(3,2) – nikpod

+0

我知道你的意思,但是當使用*表示元素方式乘數關於數組時,他們輸入的是一個數組。例如,如果你有c(數組類型)形狀是(2,3)* d(數組類型)形狀是(3,2)是錯誤的,因爲它們的形狀是不同的。@ nikpod –

回答

1

您的a * b.T是元素乘法,並且因爲broadcasting而工作。此外,還有許多其他二元操作都適用於這對形狀。

a是(3,1)。 b.T是(1,2)。廣播結合(3,1)與(1,2)產生(3,2)。尺寸1尺寸被調整以匹配其他非零尺寸。

除非您用np.matrix製作陣列,否則*不會執行數學matrix multiplicationnp.dot用於執行(@np.einsum也這樣做)。

有了這種形狀的特殊組合,dot產品是相同的。 np.outer(a,b)也產生這個,數學outer productnp.dota的最後一個維度相匹配,第二個維度的最後一維爲b.T。在這種情況下,它們都是1.當共享維度具有多個項目時,dot更有趣,產生熟悉的sum of products

In [5]: np.dot(a, b.T) 
Out[5]: 
array([[ 4, 5], 
     [ 8, 10], 
     [12, 15]]) 

'外' 加法:

In [3]: a + b.T 
Out[3]: 
array([[5, 6], 
     [6, 7], 
     [7, 8]]) 

它可以幫助一下ab這樣的:

In [7]: a 
Out[7]: 
array([[1], 
     [2], 
     [3]]) 
In [8]: b 
Out[8]: 
array([[4], 
     [5]]) 
In [9]: b.T 
Out[9]: array([[4, 5]]) 

我一般不使用matrix談論numpy陣列除非它們使用np.matrix創建,或更頻繁地使用scipy.sparse創建。 numpy數組可以是0d,1d,2d和更高。我更注重形狀而不是名字。

+0

是的,正是我剛纔所想的從文檔中刪除。廣播是OP獲得該輸出的原因。 – nikpod

+0

非常好,謝謝 –