规范化/翻译ndarray - Numpy/Python

pce*_*con 4 python numpy normalization multidimensional-array

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

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

a = [[1., 2., 3.],
     [4., 5., 6.],
     [7., 8., 9.]]
Run Code Online (Sandbox Code Playgroud)

到现在为止,我正在获得最大值

max(max(p[1:]) for p in a)
a / p
Run Code Online (Sandbox Code Playgroud)

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

b = [[-1., -2., -3.],
     [-4., -5., -6.],
     [-7., -8., 0.]]
Run Code Online (Sandbox Code Playgroud)

这给出了由零分割引起的错误.

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

我怎么能用numpy很好地完成这个?

先感谢您.

mgi*_*son 7

在一般情况下,你可以使用np.ptp1(峰到峰)np.min来做到这一点:

new_arr = (a - a.min())/np.ptp(a)
Run Code Online (Sandbox Code Playgroud)

例:

>>> 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]])
Run Code Online (Sandbox Code Playgroud)

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

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