有一种简单的方法来规范化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很好地执行此操作?
提前谢谢。
答案 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.max
和np.min
。如果性能非常重要,那么您可以创建自己的ptp
并将np.min
保存到临时变量,这样就不会计算两次。