2 回答

TA貢獻1797條經驗 獲得超6個贊
在 numpy 中,dot并不真正意味著點積。dot本質上類似于矩陣乘法。因此,有人可能會說它既多余又令人困惑,這就是為什么我自己根本不使用它。
要獲得您似乎想要的行為,您可以使用vdot:
>>> np.vdot(a1,a2)
14
>>> np.vdot(a2,a1)
14

TA貢獻1775條經驗 獲得超11個贊
In [189]: a1 = np.array([[1], [2], [3]])
...: a2 = np.array([[1, 2, 3, 4]])
In [190]:
In [190]: a1.shape, a2.shape
Out[190]: ((3, 1), (1, 4))
矩陣乘法:
In [191]: a1@a2 # np.matmul
Out[191]:
array([[ 1, 2, 3, 4],
[ 2, 4, 6, 8],
[ 3, 6, 9, 12]])
廣播元素乘法:
In [192]: a1*a2
Out[192]:
array([[ 1, 2, 3, 4],
[ 2, 4, 6, 8],
[ 3, 6, 9, 12]])
(3,1) 與 (1,4) => (3,4) 與 (3,4) => (3,4)
調整 Size 1 維度以匹配其他數組
與matmul:
In [193]: a1.dot(a2)
Out[193]:
array([[ 1, 2, 3, 4],
[ 2, 4, 6, 8],
[ 3, 6, 9, 12]])
形狀不匹配:
In [194]: a2.dot(a1)
Traceback (most recent call last):
File "<ipython-input-194-4e2276e15f5f>", line 1, in <module>
a2.dot(a1)
ValueError: shapes (1,4) and (3,1) not aligned: 4 (dim 1) != 3 (dim 0)
用愛因斯坦符號:
In [195]: np.einsum('ij,jk->ik',a1,a2)
Out[195]:
array([[ 1, 2, 3, 4],
[ 2, 4, 6, 8],
[ 3, 6, 9, 12]])
在真正的矩陣乘法中,這會將所有行乘以所有列,并在共享維度上求和。因為j維度為 1,所以求和沒有什么區別。
我們可以看到廣播的效果:
In [198]: np.broadcast_arrays(a1,a2)
Out[198]:
[array([[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]]),
array([[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]])]
添加回答
舉報