您的a * b.T
是元素乘法,並且因爲broadcasting
而工作。此外,還有許多其他二元操作都適用於這對形狀。
a
是(3,1)。 b.T
是(1,2)。廣播結合(3,1)與(1,2)產生(3,2)。尺寸1尺寸被調整以匹配其他非零尺寸。
除非您用np.matrix
製作陣列,否則*
不會執行數學matrix multiplication
。 np.dot
用於執行(@
和np.einsum
也這樣做)。
有了這種形狀的特殊組合,dot
產品是相同的。 np.outer(a,b)
也產生這個,數學outer product
。 np.dot
與a
的最後一個維度相匹配,第二個維度的最後一維爲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]])
它可以幫助一下a
和b
這樣的:
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和更高。我更注重形狀而不是名字。
如果您已將a重新組合爲(3,1),並將b重新組合爲(2,1)。然後a * b.T應該導致(3,2)。 'a * b.T〜=(3,1)*(1,2)'。內部尺寸匹配。所以(3,2) – nikpod
我知道你的意思,但是當使用*表示元素方式乘數關於數組時,他們輸入的是一個數組。例如,如果你有c(數組類型)形狀是(2,3)* d(數組類型)形狀是(3,2)是錯誤的,因爲它們的形狀是不同的。@ nikpod –