该@
运营商称阵列的__matmul__
方法,而不是dot
。此方法在API中也作为函数存在np.matmul
。
>>> a = np.random.rand(8,13,13)
>>> b = np.random.rand(8,13,13)
>>> np.matmul(a, b).shape
(8, 13, 13)
从文档中:
matmul
区别于dot
两个重要方面。
最后一点很明确,当传递3D(或更高维)数组时,dot
和matmul
方法的行为会有所不同。从文档中引用更多内容:
对于matmul
:
如果任一自变量的值为ND,N> 2,则将其视为驻留在最后两个索引中的矩阵的堆栈,并进行相应广播。
对于np.dot
:
对于2-D数组,它等效于矩阵乘法,对于1-D数组,其等效于向量的内积(无复共轭)。 对于N维,它是a的最后一个轴和b的倒数第二个轴的和积