简单的减法会导致不同阵列形状的广播问题

时间:2015-12-24 05:27:21

标签: python arrays numpy numpy-broadcasting

我尝试用link解决我的问题,描述了numpy广播,但无济于事。如何减去以下numpy数组:

X = np.array([[[1,2,3,4],[1,2,3,4],[1,2,3,4]],
              [[4,3,2,1],[4,3,2,1],[4,3,2,1]]])
X_mean = np.average(X_, axis=1)

当我X - X_mean时,它声明:

ValueError: operands could not be broadcast together with shapes (2,3,4) (2,4) 

但是X[0] - X_mean[0]给出了正确的输出:

array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

2 个答案:

答案 0 :(得分:3)

您需要保持broadcasting的尺寸一致。你有 -

In [4]: whos
Variable   Type       Data/Info
-------------------------------
X          ndarray    2x3x4: 24 elems, type `int64`, 192 bytes
X_mean     ndarray    2x4: 8 elems, type `float64`, 64 bytes
    Axis-0的{​​li>

    X_mean已与axis-0的{​​{1}}对齐,所以那里一切都很好。

  1. X的{​​{1}} Axis-1的{​​{1}}对齐,因此请为{{{}添加新轴1}} None/np.newaxisX_mean可以推回axis-2

  2. 让我们验证形状对齐 -

    X

    然后,执行将带来广播的减法 -

    X_mean

答案 1 :(得分:0)

作为补充:根据Numpy Broadcasting Rules

  

在两个数组上运行时,NumPy会逐元素地比较它们的形状。它从尾随尺寸开始,并向前发展。

时兼容两个维度      
      
  • 他们是平等的
  •   
  • 其中一个是1
  •   

所以最好的想法是以平均值在轴0上形成数据。

在你的情况下:

Y=np.rollaxis(X,1) # reshape (3,2,4)

Y-Y.mean(0)现在直接

array([[[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]]])