2014-11-06 15 views
18

Potrzebuję znormalizować listę wartości, aby pasowały do ​​rozkładu prawdopodobieństwa, tj. Od 0,0 do 1,0.Normalizowanie listy liczb w Pythonie

Rozumiem, jak znormalizować, ale był ciekawy, czy Python miał funkcję automatyzacji tego.

Chciałabym pójść z:

raw = [0.07, 0.14, 0.07] 

do

normed = [0.25, 0.50, 0.25] 
+2

dlaczego nie byłby to być '[0.5, 1.0, 0.5]'? –

+3

@Joran Ponieważ OP chce 'sum (normed) == 1.0' (ignorując błędy zmiennoprzecinkowe). – Kevin

+0

ahh Widzę teraz ... –

Odpowiedz

32

użytkowania:

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

zapewnienia, że ​​suma jest zawsze 1.0 (lub tak blisko jak możliwy).

użycie

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

ponownie normalizuje maksymalną

+0

oh 5 sekund szybciej ode mnie :) nice – Anzel

+12

Nice. Warto zauważyć, że obliczenie kwoty z góry, a nie dla każdego elementu w zrozumieniu, byłoby bardziej wydajne. A więc: 's = suma (surowa); norm = [float (i)/s dla i in raw] ' – ohruunuruus

+0

Czy to jest to samo co' (np.array (x)/np.array (x) .sum())/np.array (x) .max() '? – alvas

4

spróbować:

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

normed 
[0.25, 0.5, 0.25] 
3

Nie ma żadnej funkcji w bibliotece standardowej (według mojej wiedzy), która to zrobi, ale są tam absolutnie moduły, które mają takie funkcje. Jednak jej tyle, że można po prostu napisać własną funkcję proste: wyjście

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

próbki:

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

Jest to jedna z dwóch odpowiedzi, które wyodrębniają 'sum()' z pętli ... Wciąż wolę moje, ale myślę, że jest to '+' dokładnie dla zmiennej pomocniczej 's = sum (lst)'. – gboffi

+2

'normalize ([1,0, -1])' spowoduje podniesienie 'ZeroDivisionError' :) –

6

Jak długa jest lista idziesz do normalizacji?

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] 

Wyjście

# 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 dla wersji barokowej – njzk2

Powiązane problemy