有两个ndarray,形状为(3,10,10)的数组d
和形状(3,10)的数组e
,如何计算的第一个10x10矩阵的点积d
和e
的第一行,d
的第二个10x10矩阵和e
的第二行,等等。
例如,具有以下两个数组:
d = np.array([np.diag([1,1,1,1,1,1,1,1,1,1]),
np.diag([2,2,2,2,2,2,2,2,2,2]),
np.diag([3,3,3,3,3,3,3,3,3,3])])
e = np.arange(30).reshape((3,10))
如何计算3x10数组:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[20, 22, 24, 26, 28, 30, 32, 34, 36, 38],
[60, 63, 66, 69, 72, 75, 78, 81, 84, 87]])
我尝试使用np.dot
和np.tensordot
,还尝试在e
上移置并添加新轴,但是我不知道该如何解决这个问题。
答案 0 :(得分:2)
我们可以使用np.einsum
-
np.einsum('ijk,ij->ik',d,e)
使用其optimize
标志来使用BLAS。
或np.matmul
-
np.matmul(d,e[...,None])[...,0]
注意:在Python 3.x上,np.matmul
可以替换为@ operator
。