3d 和 1d 数组的乘积和求和

Product and summation with 3d and 1d arrays

给定一个维度为 (K,n,m) 的 3d 数组 X,可以将其视为 K (n,m) 矩阵和一维向量 b (dim n),目标是获得结果向量 r (dim n) 其中每个分量计算如下:

很容易看出k求和下的表达式(即两个内和)只是点积X_k b X_k(和,因此,可以使用 numpy) 轻松计算。所以,想要的向量r

其中 X_k 是第 k-th 2d (n,m) 'layer' 的 3d 数组 X.

即当前的解决方案是

r = 0
for k in range(K):
    r += x[k,:,:] @ (b @ x[k, :, :])

r 能否通过 k 有效计算避免 for 循环? 或者也许还有另一种有效的方法来计算 r?

(我尝试了 np.tensordot 但由于它只是 k 的纯粹求和,我还没有得到正确的结果。)

这看起来是 einsum 的完美用例:

r = np.einsum('kij,l,klj->i', x, b, x)

这将矢量化操作,例如它比 for 循环更优化。