Normalizando los valores del diccionario

Tengo un diccionario (bastante grande) que tiene valores numéricos, por ejemplo, en el formulario data = {'a': 0.2, 'b': 0.3, ...} . ¿Cuál es la mejor manera de normalizar estos valores (EDITAR: asegúrese de que los valores sumen 1)?

Y en lo que estoy especialmente interesado: ¿Sería beneficioso, para cierto tamaño de conjunto de datos, usar, por ejemplo, numpy en lugar de dictadura de dictado?

Estoy usando python 2.7.

Intenta esto para modificar en su lugar:

 d={'a':0.2, 'b':0.3} factor=1.0/sum(d.itervalues()) for k in d: d[k] = d[k]*factor 

resultado:

 >>> d {'a': 0.4, 'b': 0.6} 

Alternativamente, para modificar un nuevo diccionario, use una comprensión de dictado:

 d={'a':0.2, 'b':0.3} factor=1.0/sum(d.itervalues()) normalised_d = {k: v*factor for k, v in d.iteritems() } 

Tenga en cuenta el uso de d.iteritems () que usa menos memoria que d.items (), por lo que es mejor para un diccionario grande.

EDITAR : Ya que hay bastantes de ellos, y hacer esto bien parece ser importante, he resumido todas las ideas en los comentarios a esta respuesta, junto con lo siguiente (incluido pedir algo prestado de esta publicación ):

 import math import operator def really_safe_normalise_in_place(d): factor=1.0/math.fsum(d.itervalues()) for k in d: d[k] = d[k]*factor key_for_max = max(d.iteritems(), key=operator.itemgetter(1))[0] diff = 1.0 - math.fsum(d.itervalues()) #print "discrepancy = " + str(diff) d[key_for_max] += diff d={v: v+1.0/v for v in xrange(1, 1000001)} really_safe_normalise_in_place(d) print math.fsum(d.itervalues()) 

Tomé un par de ejemplos para crear un diccionario que realmente creó un error distinto de cero al normalizar, pero espero que esto ilustre el punto.

 def normalize(d, target=1.0): raw = sum(d.values()) factor = target/raw return {key:value*factor for key,value in d.iteritems()} 

Úsalo así:

 >>> data = {'a': 0.2, 'b': 0.3, 'c': 1.5} >>> normalize(data) {'b': 0.15, 'c': 0.75, 'a': 0.1}