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

时间:2016-04-28 12:30:33

标签: python arrays numpy

例如,我有一个定义为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 个答案:

答案 0 :(得分:2)

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

您可以通过向keepdims提供numpy.mean参数来解决此问题:

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

如果不存在,则可以选择使用reshape

答案 1 :(得分:2)

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

B = A - M[:, None]

(M [:,None] .shape是(2,1),所以广播发生了)

答案 2 :(得分:1)

您可以使用subtract中的dividenumpy功能。解决你的例子:

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]]