归一化/转换ndarray - Numpy/Python
有没有简单的方法可以把一个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 个回答
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如果我没记错的话,np.ptp
会调用 np.max
和 np.min
。如果性能非常重要,你可能想自己写一个 ptp
,并把 np.min
的结果存到一个临时变量里,这样就不会重复计算了。