Normaliser une liste de nombres en Python

J'ai besoin de normaliser une liste de valeurs pour tenir dans une distribution de probabilité, c'est-à-dire entre 0.0 et 1.0.

Je comprends Comment normaliser, mais j'étais curieux de savoir si Python avait une fonction pour automatiser cela.

Je voudrais aller de:

raw = [0.07, 0.14, 0.07]  

À

normed = [0.25, 0.50, 0.25]
21
demandé sur APerson 2014-11-06 20:12:59

7 réponses

Utilisation:

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

Pour normaliser par rapport à la somme pour s'assurer que la somme est toujours 1.0 (ou aussi proche que possible).

Utiliser

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

Pour normaliser par rapport au maximum

40
répondu Tony Suffolk 66 2018-06-19 10:07:10

Quelle est la durée de la liste que vous allez normaliser?

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]

Sortie

# 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]
6
répondu gboffi 2014-11-06 17:32:36

Essayez:

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

normed
[0.25, 0.5, 0.25]
4
répondu Anzel 2014-11-06 17:18:14

Il N'y a aucune fonction dans la bibliothèque standard (à ma connaissance) qui le fera, mais il y a absolument des modules qui ont de telles fonctions. Cependant, son assez facile que vous pouvez simplement écrire votre propre fonction:

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

Exemple de sortie:

>>> normed = normalize(raw)
>>> normed
[0.25, 0.5, 0.25]
3
répondu wnnmaw 2014-11-06 17:19:34

Si votre liste a des nombres négatifs, c'est ainsi que vous la normaliseriez

a = range(-30,31,5)
norm = [(float(i)-min(a))/(max(a)-min(a)) for i in a]
2
répondu blaylockbk 2018-05-02 19:05:09

Essayez ceci :

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)

Cela fera ce que vous avez demandé. Mais je vais suggérer d'essayer la normalisation Min-Max.

Normalisation 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
1
répondu Nurul Akter Towhid 2018-03-29 07:51:49

Si vous envisagez d'utiliser numpy, vous pouvez obtenir une solution plus rapide.

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
1
répondu Tengerye 2018-09-18 12:16:13