对角阵列上的 numpy 线性代数,没有显式重复

numpy linear algebra on diagonal arrays without explicit duplication

我有一个数组w(形状(3000, 100, 100)),我想将它与另一个数组e(形状(5, 3000))相乘,使得结果k 的形状为 (5, 5, 100, 100)

k[:, :, i, j] = e @ np.diag(w[:, i, j]) @ e.T

由于 w 如此之大,制作一些形状为 (3000, 3000, 100, 100)super_w 数组并显式填充主对角线是不切实际的。循环 ij 也不是很有效。除了将 w 分成块之外,是否有一种节省内存的方法来执行此操作?

np.einsum-

k = np.einsum('li,ijk,mi->lmjk',e,w,e)