归一化/转换ndarray - Numpy/Python

4 投票
1 回答
756 浏览
提问于 2025-04-17 22:41

有没有简单的方法可以把一个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.ptp1(峰值到谷值)结合 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.maxnp.min。如果性能非常重要,你可能想自己写一个 ptp,并把 np.min 的结果存到一个临时变量里,这样就不会重复计算了。

撰写回答