使用einsum而不进行显式复制

时间:2016-01-21 08:02:17

标签: python arrays numpy numpy-einsum

我有一个形状(n,n)的矩阵A和另一个形状(p,n)的矩阵b。我需要得到一个矩阵C,这样

C[i] = (A * b[i, np.newaxis, :]) * b[i, :, np.newaxis]

我目前正在通过执行np.matlib.repmat(A)然后使用np.einsum执行此操作

A1 = np.matlib.repmat(A, p, 1).reshape(p, n, n)
C = np.einsum('ijk, ij..., ik... -> ijk', A1, b, b)

但是我可以看到创建A1是浪费资源,因为它只是一遍又一遍地使用相同的值。无论如何我可以在不创建中间矩阵A1的情况下做到这一点吗?

1 个答案:

答案 0 :(得分:2)

像这样使用np.einsum -

np.einsum('ij,kij,kij->kij',A,b[:,None,:],b[...,None])