Normalizando una lista de números en Python
probability (7)
¿Cuánto dura la lista que vas a normalizar?
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]
Salida
# 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]
Necesito normalizar una lista de valores para encajar en una distribución de probabilidad, es decir, entre 0.0 y 1.0.
Entiendo cómo normalizar, pero tenía curiosidad si Python tenía una función para automatizar esto.
Me gustaría ir desde
raw = [0.07, 0.14, 0.07]
a
normed = [0.25, 0.50, 0.25]
No hay ninguna función en la biblioteca estándar (que yo sepa) que lo hará, pero hay absolutamente módulos por ahí que tienen tales funciones. Sin embargo, es bastante fácil que solo puedas escribir tu propia función:
def normalize(lst):
s = sum(lst)
return map(lambda x: float(x)/s, lst)
Salida de muestra:
>>> normed = normalize(raw)
>>> normed
[0.25, 0.5, 0.25]
Si considera usar numpy
, puede obtener una solución más rápida.
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
Si tu lista tiene números negativos, así es como lo normalizarías.
a = range(-30,31,5)
norm = [(float(i)-min(a))/(max(a)-min(a)) for i in a]
Utilizar :
norm = [float(i)/sum(raw) for i in raw]
normalizar contra la suma para garantizar que la suma sea siempre 1.0 (o lo más cerca posible).
utilizar
norm = [float(i)/max(raw) for i in raw]
normalizar contra el máximo
tratar:
normed = [i/sum(raw) for i in raw]
normed
[0.25, 0.5, 0.25]
Prueba esto :
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)
Esto hará lo que pediste. Pero sugeriré probar la normalización de Min-Max.
normalización 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