计算两个数组列的成对总和的总和
Compute sum of pairwise sums of two array's columns
我正在寻找一种方法来避免以下代码段中的嵌套循环,其中 A
和 B
是二维数组,每个形状 (m, n)
具有 m
, n
是任意正整数:
import numpy as np
m, n = 5, 2
a = randint(0, 10, (m, n))
b = randint(0, 10, (m, n))
out = np.empty((n, n))
for i in range(n):
for j in range(n):
out[i, j] = np.sum(A[:, i] + B[:, j])
以上逻辑大致等同于
np.einsum('ij,ik', A, B)
除了 einsum
计算乘积之和。
有没有一种方法,相当于 einsum
,可以计算总和?还是我必须为此操作编写扩展?
einsum
需要执行逐元素乘法,然后进行求和(可选)。 因此,可能 applicable/needed 无法解决我们的问题。 请继续阅读!
方法 #1
我们可以利用 broadcasting
使第一个轴对齐
在将维度扩展到 3D
之后,第二个轴按元素求和。最后,我们需要沿第一个轴求和 -
(A[:,:,None] + B[:,None,:]).sum(0)
方法 #2
我们可以简单地对每个 -
的柱状求和进行外加
A.sum(0)[:,None] + B.sum(0)
方法 #3
因此,引入 einsum
-
np.einsum('ij->j',A)[:,None] + np.einsum('ij->j',B)
您也可以使用 numpy.ufunc.outer
,特别是在 numpy.add.outer
沿轴 0 求和后,如 #approach 2
中提到的@Divakar
In [126]: numpy.add.outer(a.sum(0), b.sum(0))
Out[126]:
array([[54, 67],
[43, 56]])
我正在寻找一种方法来避免以下代码段中的嵌套循环,其中 A
和 B
是二维数组,每个形状 (m, n)
具有 m
, n
是任意正整数:
import numpy as np
m, n = 5, 2
a = randint(0, 10, (m, n))
b = randint(0, 10, (m, n))
out = np.empty((n, n))
for i in range(n):
for j in range(n):
out[i, j] = np.sum(A[:, i] + B[:, j])
以上逻辑大致等同于
np.einsum('ij,ik', A, B)
除了 einsum
计算乘积之和。
有没有一种方法,相当于 einsum
,可以计算总和?还是我必须为此操作编写扩展?
einsum
需要执行逐元素乘法,然后进行求和(可选)。 因此,可能 applicable/needed 无法解决我们的问题。 请继续阅读!
方法 #1
我们可以利用 broadcasting
使第一个轴对齐
在将维度扩展到 3D
之后,第二个轴按元素求和。最后,我们需要沿第一个轴求和 -
(A[:,:,None] + B[:,None,:]).sum(0)
方法 #2
我们可以简单地对每个 -
的柱状求和进行外加A.sum(0)[:,None] + B.sum(0)
方法 #3
因此,引入 einsum
-
np.einsum('ij->j',A)[:,None] + np.einsum('ij->j',B)
您也可以使用 numpy.ufunc.outer
,特别是在 numpy.add.outer
沿轴 0 求和后,如 #approach 2
In [126]: numpy.add.outer(a.sum(0), b.sum(0))
Out[126]:
array([[54, 67],
[43, 56]])