计算矩阵数组与另一个矩阵的行或列的点积

Calculate the dot product of an array of matrices and the rows or columns of another matrix

有两个 ndarrays,数组 d 的形状为 (3,10,10) 和数组 e 的形状为 (3,10),如何计算第一个 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.dotnp.tensordot,并且在这样做之前还向 e 转置并添加了一个新轴,但我不知道如何解决这个问题。

我们可以使用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