Numpy列减法:从(k,)数组中减去(k,n)数组的值。

3

假设我有

x=np.random.random((3,10))
y=np.array([1,10,100])

我想要从y中减去每个x列中的值。我可以这样做:

np.array([y]*10).T-x

然而,这需要创建一个新的数组,其大小是 y 的 10 倍(在此案例中)。我也可以想象使用 for 循环。有人能否建议更好的方法?

2个回答

4
只需将 y 垂直摆放并减去 x。例如:
y[:, None] - x    # insert a new axis into y (creating a new view of y)

或者

np.vstack(y) - x  # stack y vertically (creating a copy of y)

这是因为y现在的形状为(3,1),所以它可以与具有形状(3,10)x进行广播。
只要x的每个尾随维度(即从形状元组的末尾开始)等于y的尾随维度,或者比较的维度之一是1,则xy就可以一起进行广播。在此示例中,y的尾随维度被更改为1,以使这两个数组兼容。

1
啊...所以我也可以使用y.reshape(3,1)-x - Lee
@atomh33ls 当然可以,只要它符合所需的形状。 - Alex Riley
1
y[:,np.newaxis] 是另一种重新塑形 y 的方式。 - hpaulj

4
像这样的吗?
>>> (y - x.T).T
array([[  8.79354250e-01,   5.30104393e-01,   7.78342126e-01,
          4.56857161e-02,   5.32181828e-01,   1.47155126e-01,
          3.39654176e-01,   3.72693537e-01,   4.32737024e-01,
          7.55366710e-01],
       [  9.53976069e+00,   9.51725133e+00,   9.00439583e+00,
          9.65411497e+00,   9.55728110e+00,   9.35189161e+00,
          9.72451832e+00,   9.20089714e+00,   9.60367043e+00,
          9.41722649e+00],
       [  9.99248465e+01,   9.96932738e+01,   9.93110996e+01,
          9.94116657e+01,   9.98695626e+01,   9.92118001e+01,
          9.93602275e+01,   9.99518088e+01,   9.98442735e+01,
          9.93865628e+01]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接