Skip to main content
 首页 » 编程设计

python之将数组归一化为总和为 1.0 的两种方法

2025年05月04日21lyj

我对数组标准化且总和必须为 1.0 的两种方法感到困惑:

要归一化的数组:

array([ 1.17091033,  1.13843561,  1.240346  ,  1.05438719,  1.05386014, 
        1.15475574,  1.16127814,  1.07070739,  0.93670444,  1.20450255, 
        1.25644135]) 

方法一:

arr = np.array(values / min(values)) 
array([ 1.25003179,  1.21536267,  1.32415941,  1.12563488,  1.12507221, 
        1.23278559,  1.23974873,  1.14305788,  1.00000000,  1.28589392, 
        1.34134236]) 
 
arr1 = arr / sum(arr) # Sum total to 1.0 
array([ 0.09410701,  0.09149699,  0.09968761,  0.08474195,  0.08469959, 
        0.09280865,  0.09333286,  0.08605362,  0.07528369,  0.09680684, 
        0.1009812 ]) 

方法二:

arr = np.array((values - min(values)) / (max(values) - min(values))) 
array([ 0.73249564,  0.63092863,  0.94966065,  0.3680612,  0.3664128 , 
        0.68197101,  0.70237028,  0.41910379,  0.0000000,  0.83755771, 
        1.00000000]) 
 
arr2 = arr / sum(arr) # Sum total to 1.0 
array([ 0.10951467,  0.09432949,  0.14198279,  0.05502845,  0.054782  , 
        0.10196079,  0.10501066,  0.06265978,  0.00000000,  0.12522239, 
        0.14950897]) 

哪种方法是正确的?为什么?

请您参考如下方法:

这两种方法都将 values 修改为一个总和为 1 的数组,但它们的做法不同。

第一种方法:仅缩放

方法 1 的第一步缩放数组,使最小值变为 1。此步骤不是必需的,如果 values 具有 0 元素,则此步骤将不起作用。

>>> import numpy as np 
>>> values = np.array([2, 4, 6, 8]) 
>>> arr1 = values / values.min() 
>>> arr1 
array([ 1.,  2.,  3.,  4.]) 

方法 1 的第二步缩放数组,使其总和变为 1。通过这样做,它会覆盖第一步所做的任何更改。你不需要arr1:

>>> arr1 / arr1.sum() 
array([ 0.1,  0.2,  0.3,  0.4]) 
>>> values / values.sum() 
array([ 0.1,  0.2,  0.3,  0.4]) 

第二种方法:偏移+缩放

方法 2 的第一步对数组进行偏移和缩放,使最小值变为 0,最大值变为 1:

>>> arr2 = (values - values.min()) / (values.max() - values.min()) 
>>> arr2 
array([ 0.        ,  0.33333333,  0.66666667,  1.        ]) 

方法 2 的第二步缩放数组,使总和变为 1。仍然应用第 1 步的偏移量,但覆盖第 1 步的缩放比例。注意最小元素是0:

>>> arr2 / arr2.sum() 
array([ 0.        ,  0.16666667,  0.33333333,  0.5       ]) 

您可以直接从 values 获得此结果:

>>> (values - values.min()) / (values - values.min()).sum() 
array([ 0.        ,  0.16666667,  0.33333333,  0.5       ])