在形状不同的操作数上执行向量减法的Numpythonic方法 (a,n) - (b,n)

1 投票
2 回答
35 浏览
提问于 2025-04-14 15:32

我有两个矩阵,长得像这样:

a = np.array([[1,2], [3,4], [5,6], [7,8]])
b = np.array([[9,10], [11,12], [13,14]])

如果我们调试一下 ab,它们看起来会是这样的:

[[1 2]
 [3 4]
 [5 6]
 [7 8]]
(4, 2)
int32

[[ 9 10]
 [11 12]
 [13 14]]
(3, 2)
int32

我可以通过这种方式实现我想要的结果,其中 c 是结果:

c = []
for i in range(b.shape[0]):
  c.append(b[i] - a)
c = np.array(c)

现在,c 看起来是这样的:

[[[ 8  8]
  [ 6  6]
  [ 4  4]
  [ 2  2]]

 [[10 10]
  [ 8  8]
  [ 6  6]
  [ 4  4]]

 [[12 12]
  [10 10]
  [ 8  8]
  [ 6  6]]]
(3, 4, 2)
int32

正如你所看到的,我进行减法运算时还是用了 for 循环,有没有一种更“numpy”的方法,可以不使用循环来进行减法,这样我就可以利用 numpy 的优化,提升性能,因为 numpy 是用 C 语言 编写的。

2 个回答

2

要直接使用numpy数组的操作,可以这样做:

b[:, None] - a

可以查看文档中的广播部分,了解更多信息。

2

你可以这样做:

>>> a = np.array([[1,2], [3,4], [5,6], [7,8]])
>>> b = np.array([[9,10], [11,12], [13,14]])
>>> b[:, None, :] - a[None, :, :]
    array([[[ 8,  8],
        [ 6,  6],
        [ 4,  4],
        [ 2,  2]],
    
       [[10, 10],
        [ 8,  8],
        [ 6,  6],
        [ 4,  4]],
    
       [[12, 12],
        [10, 10],
        [ 8,  8],
        [ 6,  6]]])

撰写回答