@ajcr的回答解释了dot
和matmul
(由@
符号调用)之间的区别。通过查看一个简单的例子,人们可以清楚地看到这两个在操作“矩阵堆栈”或张量时的不同行为。
为了澄清差异,拿一个4x4数组并返回它与一个3x4x2“矩阵堆栈”或张量的dot
积和matmul
积。
import numpy as np
fourbyfour = np.array([
[1,2,3,4],
[3,2,1,4],
[5,4,6,7],
[11,12,13,14]
])
threebyfourbytwo = np.array([
[[2,3],[11,9],[32,21],[28,17]],
[[2,3],[1,9],[3,21],[28,7]],
[[2,3],[1,9],[3,21],[28,7]],
])
print('4x4*3x4x2 dot:\n {}\n'.format(np.dot(fourbyfour,threebyfourbytwo)))
print('4x4*3x4x2 matmul:\n {}\n'.format(np.matmul(fourbyfour,threebyfourbytwo)))
每个操作的结果如下所示。请注意,点积是在a的最后一个轴和b的倒数第二个轴上进行的总和乘积,
...而矩阵积是通过将矩阵广播在一起形成的。
(注:该段文字描述了向量和矩阵运算中的点积和矩阵积的特点)
4x4*3x4x2 dot:
[[[232 152]
[125 112]
[125 112]]
[[172 116]
[123 76]
[123 76]]
[[442 296]
[228 226]
[228 226]]
[[962 652]
[465 512]
[465 512]]]
4x4*3x4x2 matmul:
[[[232 152]
[172 116]
[442 296]
[962 652]]
[[125 112]
[123 76]
[228 226]
[465 512]]
[[125 112]
[123 76]
[228 226]
[465 512]]]
matmul
函数?@
作为中缀运算符是新的,但是该函数即使没有它也能正常工作。 - hpaulj