给定两个数组A
(形状:M X C)和B
(形状:N X C),有没有办法在不使用循环的情况下从每一行A
中减去每一行B
?最终输出将为(M N X C)形状。
例子
A = np.array([[ 1, 2, 3],
[100, 200, 300]])
B = np.array([[ 10, 20, 30],
[1000, 2000, 3000],
[ -10, -20, -2]])
所需结果(可以具有其他形状)(已编辑):array([[ -9, -18, -27],
[-999, -1998, -2997],
[ 11, 22, 5],
[ 90, 180, 270],
[-900, -1800, -2700],
[ 110, 220, 302]])
Shape: 6 X 3
(循环太慢,“外部”减去每个元素而不是每一行) 最佳答案
可以像这样利用 broadcasting
来高效地执行此操作(不使用任何循环):
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]])
或者,对于比
broadcasting
更快的解决方案,我们将不得不像下面这样使用numexpr:In [31]: A_3D = A[:, np.newaxis]
In [32]: import numexpr as ne
# pass the expression for subtraction as a string to `evaluate` function
In [33]: ne.evaluate('A_3D - B').reshape(-1, A.shape[1])
Out[33]:
array([[ -9, -18, -27],
[ -999, -1998, -2997],
[ 11, 22, 5],
[ 90, 180, 270],
[ -900, -1800, -2700],
[ 110, 220, 302]], dtype=int64)
一种效率最低的方法是使用np.repeat和np.tile匹配两个数组的形状。但是,请注意,这是效率最低的选项,因为在尝试匹配形状时,它会使复制。
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]])
关于python - 从矩阵B的每一行中减去矩阵A的每一行而无循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48359053/