从没有循环的矩阵B的每一行减去矩阵A的每一行

2024-09-27 23:24:14 发布

您现在位置:Python中文网/ 问答频道 /正文

给定两个数组A(shape:mxc)和B(shape:nxc),有没有一种方法可以在不使用循环的情况下从B的每一行中减去{}的每一行吗?最终的输出将是形状(mnxc)。在


示例

A = np.array([[  1,   2,   3], 
              [100, 200, 300]])

B = np.array([[  10,   20,   30],
              [1000, 2000, 3000],
              [ -10,  -20,   -2]])

所需结果(可以有其他形状)(已编辑):

^{pr2}$

(循环太慢,“outer”减去每个元素而不是每行)


Tags: 方法元素编辑示例np情况数组array
2条回答

使用Kronecker product^{}):

>>> import numpy as np
>>> A = np.array([[  1,   2,   3], 
...               [100, 200, 300]])
>>> B = np.array([[  10,   20,   30],
...               [1000, 2000, 3000],
...               [ -10,  -20,   -2]])
>>> (m,c) = A.shape
>>> (n,c) = B.shape
>>> np.kron(A,np.ones((n,1))) - np.kron(np.ones((m,1)),B)
array([[   -9.,   -18.,   -27.],
       [ -999., -1998., -2997.],
       [   11.,    22.,     5.],
       [   90.,   180.,   270.],
       [ -900., -1800., -2700.],
       [  110.,   220.,   302.]])

通过利用^{}可以有效地(不使用任何循环)执行此操作,例如:

In [28]: (A[:, np.newaxis] - B).reshape(-1, A.shape[1])
Out[28]: 
array([[   -9,   -18,   -27],
       [ -999, -1998, -2997],
       [   11,    22,     5],
       [   90,   180,   270],
       [ -900, -1800, -2700],
       [  110,   220,   302]])

或者,为了比^{}快一点的解决方案,我们必须使用numexpr如:

^{pr2}$

另一种效率最低的方法是使用np.repeat和{a5}来匹配这两个数组的形状。但是,请注意,这是最低效的,因为当尝试匹配形状时,它会生成副本。在

In [27]: np.repeat(A, B.shape[0], 0) - np.tile(B, (A.shape[0], 1))
Out[27]: 
array([[   -9,   -18,   -27],
       [ -999, -1998, -2997],
       [   11,    22,     5],
       [   90,   180,   270],
       [ -900, -1800, -2700],
       [  110,   220,   302]])

相关问题 更多 >

    热门问题