规范化Python中的数字列表

时间:2014-11-06 17:13:00

标签: python probability

我需要规范化值列表以适应概率分布,即介于0.0和1.0之间。

我理解如何进行规范化,但是如果Python有自动执行此功能的话,我很好奇。

我想来自:

raw = [0.07, 0.14, 0.07]  

normed = [0.25, 0.50, 0.25]

10 个答案:

答案 0 :(得分:51)

使用:

norm = [float(i)/sum(raw) for i in raw]

对总和进行标准化,以确保总和始终为1.0(或尽可能接近)。

使用

norm = [float(i)/max(raw) for i in raw]

针对最大值进行标准化

答案 1 :(得分:6)

您要将标准化列表标准化多长时间?

def psum(it):
    "This function makes explicit how many calls to sum() are done."
    print "Another call!"
    return sum(it)

raw = [0.07,0.14,0.07]
print "How many calls to sum()?"
print [ r/psum(raw) for r in raw]

print "\nAnd now?"
s = psum(raw)
print [ r/s for r in raw]

# if one doesn't want auxiliary variables, it can be done inside
# a list comprehension, but in my opinion it's quite Baroque    
print "\nAnd now?"
print [ r/s  for s in [psum(raw)] for r in raw]

输出

# How many calls to sum()?
# Another call!
# Another call!
# Another call!
# [0.25, 0.5, 0.25]
# 
# And now?
# Another call!
# [0.25, 0.5, 0.25]
# 
# And now?
# Another call!
# [0.25, 0.5, 0.25]

答案 2 :(得分:5)

尝试:

normed = [i/sum(raw) for i in raw]

normed
[0.25, 0.5, 0.25]

答案 3 :(得分:3)

标准库中没有任何功能(据我所知)会这样做,但是有绝对的模块具有这样的功能。但是,它很容易编写自己的函数:

def normalize(lst):
    s = sum(lst)
    return map(lambda x: float(x)/s, lst)

示例输出:

>>> normed = normalize(raw)
>>> normed
[0.25, 0.5, 0.25]

答案 4 :(得分:2)

如果您的列表有负数,这就是您将其标准化的方式

a = range(-30,31,5)
norm = [(float(i)-min(a))/(max(a)-min(a)) for i in a]

答案 5 :(得分:2)

如果您考虑使用numpy,则可以获得更快的解决方案。

import random, time
import numpy as np

a = random.sample(range(1, 20000), 10000)
since = time.time(); b = [i/sum(a) for i in a]; print(time.time()-since)
# 0.7956490516662598

since = time.time(); c=np.array(a);d=c/sum(a); print(time.time()-since)
# 0.001413106918334961

答案 6 :(得分:1)

试试这个:

from __future__ import division

raw = [0.07, 0.14, 0.07]  

def norm(input_list):
    norm_list = list()

    if isinstance(input_list, list):
        sum_list = sum(input_list)

        for value in input_list:
            tmp = value  /sum_list
            norm_list.append(tmp) 

    return norm_list

print norm(raw)

这会做你所要求的。 但我会建议尝试Min-Max规范化。

min-max规范化:

def min_max_norm(dataset):
    if isinstance(dataset, list):
        norm_list = list()
        min_value = min(dataset)
        max_value = max(dataset)

        for value in dataset:
            tmp = (value - min_value) / (max_value - min_value)
            norm_list.append(tmp)

    return norm_list

答案 7 :(得分:1)

如果要处理数据,很多时候pandas是简单键

此特定代码会将raw放入一列,然后按每行的列进行归一化。 (但是我们也可以将其放在一行中,也可以按列每行进行!只需更改axis值,其中0表示行,1表示列。)

import pandas as pd


raw = [0.07, 0.14, 0.07]  

raw_df = pd.DataFrame(raw)
normed_df = raw_df.div(raw_df.sum(axis=0), axis=1)
normed_df

其中normed_df的显示方式如下:

    0
0   0.25
1   0.50
2   0.25

然后也可以继续处理数据!

答案 8 :(得分:1)

对于想使用scikit-learn的人,您可以使用

from sklearn.preprocessing import normalize

x = [1,2,3,4]
normalize([x]) # array([[0.18257419, 0.36514837, 0.54772256, 0.73029674]])
normalize([x], norm="l1") # array([[0.1, 0.2, 0.3, 0.4]])
normalize([x], norm="max") # array([[0.25, 0.5 , 0.75, 1.]])

答案 9 :(得分:1)

这是一个与最佳答案类似的低效单行代码(仅执行一次求和)

norm = (lambda the_sum:[float(i)/the_sum for i in raw])(sum(raw))

一个类似的方法可以对一个带有负数的列表进行

norm = (lambda the_max, the_min: [(float(i)-the_min)/(the_max-the_min) for i in raw])(max(raw),min(raw))