如何向量化执行两个numpy数组的成对求和?

dgtucam1  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(121)

我有两个numpy数组,看起来像这样:

x = [v1, v2, v3, ..., vm]
y = [w1, w2, w3, ..., wn]

其中vi, wj是长度为3的numpy数组。
我想对v和w进行两两求和,得到最终的数组

z = [v1+w1, v1+w2,...,v1+wn,v2+w1, ..., vi+wj, ..., vm+wn]

获得z的简单方法如下:

z = np.zeros ((m*n, 3))
for i in range(m):
    for j in range(n):
        z[n*i+j] = x[i] + y[j]

这种计算是不可行的,因为m, n都很大。
我知道scipy.spatial有一些方法可以使用distance_matrix以矢量化的方式枚举成对距离。
我想问一下,对于numpy数组,是否有执行这种成对 * 加法 * 的向量化版本?

u5rb5r59

u5rb5r591#

你可以利用广播,创建一个二维数组,然后你可以很容易地得到z[i,j] = x[i] + y[j]

x = np.reshape(x, (-1, 1)) # shape (N, 1)
y = np.reshape(y, (-1, 1)) # shape (N, 1)
z = x + y.T # shape (N, N)

如果你想把z作为一个一维数组,你可以做z.reshape(-1)

mf98qq94

mf98qq942#

如果x是mx3矩阵,则y是nx3

x.shape # (m,3)
y.shape # (n,3)

x1 = x.reshape(m,1,3)      
y1 = y.reshape(1,n,3)
z = x1 + y1     # shape (m,n,3)
z1 = z.reshape(-1,3)   # (m*n, 3)

等价地

z = x[:,None]+y

测试者:

In [263]: x=np.arange(12).reshape(4,3); y=np.arange(6).reshape(2,3)    
In [264]: z = x[:,None]+y    
In [265]: z.shape
Out[265]: (4, 2, 3)
    
In [266]: z
Out[266]: 
array([[[ 0,  2,  4],
        [ 3,  5,  7]],

       [[ 3,  5,  7],
        [ 6,  8, 10]],

       [[ 6,  8, 10],
        [ 9, 11, 13]],

       [[ 9, 11, 13],
        [12, 14, 16]]])

相关问题