NumPy 中许多外积的总和

Sum of many outer products in NumPy

我有两个矩阵 AB,它们的形状都是 (N,M)。我想执行以下操作:C = np.sum(A[:,None,:]*B[:,:,None],axis=(1,2)),它对应于将A的每一行的外积与B的每一行的外积相加。 C 将具有 (N,).

的形状

问题是我在使用此表单时得到 MemoryError,因为 N=12000M=4000

有没有一种方法可以执行此操作而不必首先构建要求和的(巨大的)中间数组?

我怀疑 np.einsum 的解决方案可以解决问题,但我不熟悉它!

不确定 np.einsum 是否解决了内存问题,但下面是您使用它进行的等效计算:

C = np.einsum('ij,ik->i',A,B)

对于未来的读者:此操作在数学上等同于将 A 的每一行的总和乘以 B 的每一行的总和。换句话说,最快的解决方案是 C = np.sum(A,axis=-1) * np.sum(B,axis=-1).

这比 np.einsum 和任何其他计算方法快得多。