代码之家  ›  专栏  ›  技术社区  ›  Fomalhaut

如何在Python Numpy中减除2D数组和1D数组?

  •  0
  • Fomalhaut  · 技术社区  · 8 年前

    例如,我有一个定义为a的2D numpy数组。我想根据以下语句将其转换为另一个2D数组:

    B = A - mean(A), the mean by the second axis
    C = B / mean(A)
    

    例如:

    >>> import numpy as np
    >>> A = np.array([[1, 2, 3], [4, 6, 8]])
    >>> A
    array([[1, 2, 3],
           [4, 6, 8]])
    >>> M = np.mean(A, axis=1)
    >>> M
    array([ 2.,  6.])
    >>> B = ... # ???
    >>> B
    array([[-1., 0., 1.],
           [-2., 0., 2.]])
    >>> C = ... # ???
    >>> C
    array([[-0.5, 0., 0.5],
           [-0.33333333, 0., 0.33333333]])
    
    3 回复  |  直到 8 年前
        1
  •  3
  •   Gareth McCaughan    8 年前

    令人恼火的是, numpy.mean(axis=...) 为您提供了一个数组,其中相关轴已被删除,而不是设置为大小1。因此,当您将此应用于轴=1的2x3数组时,您得到的是大小为2的(秩-1)数组,而不是您真正想要的2x1数组。

    您可以通过提供 keepdims 参数到 numpy.mean :

    M = np.mean(A, axis=1, keepdims=True)
    

    如果那不存在,另一种选择就是使用 reshape .

        2
  •  3
  •   P. Camilleri    8 年前

    Gareht McCaughan的解决方案更优雅,但在这种情况下 keepdims 不存在,您可以将新轴添加到 M :

    B = A - M[:, None]
    

    (M[:,None]。形状为(2,1),因此进行广播)

        3
  •  1
  •   armatita zgoda    8 年前

    您可以使用这些功能 subtract divide 从…起 numpy .解决您的示例:

    import numpy as np
    A = np.array([[1, 2, 3], [4, 6, 8]])
    M = np.mean(A, axis=1)
    B = np.subtract(A.T,M).T
    C = np.divide(B.T,M).T
    print(B)
    print(C)
    

    ,结果为:

    [[-1.  0.  1.]
     [-2.  0.  2.]]
    [[-0.5         0.          0.5       ]
     [-0.33333333  0.          0.33333333]]