2014-11-06 13 views
18

Ho bisogno di normalizzare un elenco di valori per rientrare in una distribuzione di probabilità, vale a dire tra 0,0 e 1,0.Normalizzazione di un elenco di numeri in Python

Capisco come normalizzare, ma era curioso se Python avesse una funzione per automatizzarlo.

Mi piacerebbe andare da:

raw = [0.07, 0.14, 0.07] 

a

normed = [0.25, 0.50, 0.25] 
+2

perché andrei che essere '[0.5, 1.0, 0.5]'? –

+3

@Joran Perché OP vuole 'sum (normed) == 1.0' (ignorando errori in virgola mobile). – Kevin

+0

ahh ora vedo ... –

risposta

32

Usa:

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

per assicurare che la somma è sempre 1.0 (o il più vicino come possibile).

uso

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

per normalizzare nuovamente la massima

+0

oh 5 secondi più veloce di me :) nice – Anzel

+12

Nice. Vale forse la pena notare che calcolare la somma in anticipo, piuttosto che per ogni elemento della comprensione, sarebbe più efficiente. Quindi: 's = sum (raw); norm = [float (i)/s per i in raw] ' – ohruunuruus

+0

È lo stesso di' (np.array (x)/np.array (x) .sum())/np.array (x) .max() '? – alvas

4

prova:

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

normed 
[0.25, 0.5, 0.25] 
3

Non c'è alcuna funzione nella libreria standard (a mia conoscenza) che lo farà, ma ci sono assolutamente moduli là fuori che hanno tali funzioni. Tuttavia, la sua abbastanza che si può solo scrivere la propria funzione facile: uscita

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

Esempio:

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

Questa è una delle due risposte che estrae 'sum()' dal ciclo ... Continuo a preferire il mio ma penso che questo sia un '+' esattamente per la variabile ausiliaria 's = sum (lst)'. – gboffi

+2

'normalize ([1,0, -1])' genererà 'ZeroDivisionError' :) –

6

Quanto è lunga la lista si sta andando a normalizzare?

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] 

uscita

# 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 per la versione barocca – njzk2

Problemi correlati