2014-11-06 6 views
18

Мне нужно нормализовать список значений для размещения в распределении вероятностей, то есть между 0.0 и 1.0.Нормализация списка чисел в Python

Я понимаю как для нормализации, но было любопытно, если у Python была функция для автоматизации этого.

Я хотел бы перейти от:

raw = [0.07, 0.14, 0.07] 

в

normed = [0.25, 0.50, 0.25] 
+2

почему Wouldnt это будет '[0,5, 1,0, 0,5]'? –

+3

@Joran Потому что OP хочет 'sum (normed) == 1.0' (игнорируя ошибки с плавающей запятой). – Kevin

+0

ahh Теперь я вижу ... –

ответ

32

Использование:

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

, чтобы гарантировать, что сумма всегда 1,0 (или как можно ближе как возможное).

использование

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

нормализовать снова максимальную

+0

oh 5 секунд быстрее меня :) nice – Anzel

+12

Nice. Возможно, стоит отметить, что вычисление суммы заранее, а не для каждого элемента в понимании, было бы более эффективным. Итак: 's = sum (raw); norm = [float (i)/s для i в raw] ' – ohruunuruus

+0

Это то же самое, что и' (np.array (x)/np.array (x) .sum())/np.array (x) .max() '? – alvas

4

попробовать:

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

normed 
[0.25, 0.5, 0.25] 
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] 
+0

Это один из двух ответов, которые извлекают 'sum()' из цикла ... Я по-прежнему предпочитаю мой, но я думаю, что это '+' точно для вспомогательной переменной 's = sum (lst)'. – gboffi

+2

'normalize ([1,0, -1])' будет поднять 'ZeroDivisionError' :) –

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

+1 для барочной версии – njzk2