Ответ 1
Использование:
norm = [float(i)/sum(raw) for i in raw]
чтобы гарантировать, что сумма всегда равна 1.0 (или как можно ближе).
использовать
norm = [float(i)/max(raw) for i in raw]
чтобы снова нормализовать максимальный
Мне нужно нормализовать список значений для размещения в распределении вероятности, то есть между 0.0 и 1.0.
Я понимаю, как нормализовать, но было любопытно, есть ли у Python функция для автоматизации этого.
Я хотел бы перейти от:
raw = [0.07, 0.14, 0.07]
to
normed = [0.25, 0.50, 0.25]
Использование:
norm = [float(i)/sum(raw) for i in raw]
чтобы гарантировать, что сумма всегда равна 1.0 (или как можно ближе).
использовать
norm = [float(i)/max(raw) for i in raw]
чтобы снова нормализовать максимальный
Как долго вы собираетесь нормализовать список?
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 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]
попробовать:
normed = [i/sum(raw) for i in raw]
normed
[0.25, 0.5, 0.25]
В стандартной библиотеке (насколько мне известно) нет какой-либо функции, которая будет делать это, но есть абсолютно модули, которые имеют такие функции. Однако его достаточно просто, чтобы вы могли просто написать свою собственную функцию:
def normalize(lst):
s = sum(lst)
return map(lambda x: float(x)/s, lst)
Пример вывода:
>>> normed = normalize(raw)
>>> normed
[0.25, 0.5, 0.25]