有效地减去不同形状的numpy数组

Max*_*ers 9 python arrays numpy vectorization numpy-broadcasting

使用的numpy的可以减去的形状(3)阵列的优良广播规则v从一个形状(5,3)排列X

X - v
Run Code Online (Sandbox Code Playgroud)

结果是一个shape(5,3)数组,其中每一行i都是差异X[i] - v.

有没有办法减去形状(n,3)数组w,X以便从w整个数组中减去每一行X而不显式使用循环?

Div*_*kar 12

您需要扩展Xwith 的尺寸None/np.newaxis以形成3D数组,然后进行减法w.这将broadcasting为此3D操作带来影响,并产生形状为的输出(5,n,3).实现看起来像这样 -

X[:,None] - w  # or X[:,np.newaxis] - w
Run Code Online (Sandbox Code Playgroud)

相反,如果所需的顺序是(n,5,3),那么你需要扩展尺寸w,如此 -

X - w[:,None] # or X - w[:,np.newaxis] 
Run Code Online (Sandbox Code Playgroud)

样品运行 -

In [39]: X
Out[39]: 
array([[5, 5, 4],
       [8, 1, 8],
       [0, 1, 5],
       [0, 3, 1],
       [6, 2, 5]])

In [40]: w
Out[40]: 
array([[8, 5, 1],
       [7, 8, 6]])

In [41]: (X[:,None] - w).shape
Out[41]: (5, 2, 3)

In [42]: (X - w[:,None]).shape
Out[42]: (2, 5, 3)
Run Code Online (Sandbox Code Playgroud)