规范化/翻译ndarray - Numpy / Python

时间:2014-03-17 16:06:36

标签: python numpy normalization multidimensional-array

有一种简单的方法来规范化ndarray(每个值在0.0,1.0之间)?

例如,我有一个矩阵,如:

a = [[1., 2., 3.],
     [4., 5., 6.],
     [7., 8., 9.]]

到目前为止,我正在使用

获得最大值
max(max(p[1:]) for p in a)
a / p

此外我认为 numpy 可能在一行中有一个方法,如果我的数据是这样的话,这不起作用:

b = [[-1., -2., -3.],
     [-4., -5., -6.],
     [-7., -8., 0.]]

由于零分割而产生错误。

我想要做的是最大值变为1.所以,我想做一个翻译,使得9变为1(在正例中将值除以最大值)和0(当它是最大值)变为1(使用翻译方法,例如),我知道这很热,但我想numpy可能有一个解决方案,可以在它的包中做这件事。

如何使用numpy很好地执行此操作?

提前谢谢。

1 个答案:

答案 0 :(得分:7)

您可以将np.ptp 1 (峰值到峰值)与np.min结合使用,以便在一般情况下执行此操作:

new_arr = (a - a.min())/np.ptp(a)

示例:

>>> a = np.array([[-1., 0, 1], [0, 2, 1]])
>>> np.ptp(a)
3.0
>>> a
array([[-1.,  0.,  1.],
       [ 0.,  2.,  1.]])
>>> (a - a.min())/np.ptp(a)
array([[ 0.        ,  0.33333333,  0.66666667],
       [ 0.33333333,  1.        ,  0.66666667]])

当然,如果a完全由零组成,这仍会产生错误 - 但在这种情况下,问题并不恰当。

1 IIRC,np.ptp来电np.maxnp.min。如果性能非常重要,那么您可以创建自己的ptp并将np.min保存到临时变量,这样就不会计算两次。