NumPy 中许多外积的总和
Sum of many outer products in NumPy
我有两个矩阵 A
和 B
,它们的形状都是 (N,M)
。我想执行以下操作:C = np.sum(A[:,None,:]*B[:,:,None],axis=(1,2))
,它对应于将A
的每一行的外积与B
的每一行的外积相加。 C
将具有 (N,)
.
的形状
问题是我在使用此表单时得到 MemoryError
,因为 N=12000
和 M=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
和任何其他计算方法快得多。
我有两个矩阵 A
和 B
,它们的形状都是 (N,M)
。我想执行以下操作:C = np.sum(A[:,None,:]*B[:,:,None],axis=(1,2))
,它对应于将A
的每一行的外积与B
的每一行的外积相加。 C
将具有 (N,)
.
问题是我在使用此表单时得到 MemoryError
,因为 N=12000
和 M=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
和任何其他计算方法快得多。