274 votes

Calcul de la moyenne arithmétique (un type de moyenne) en Python

Existe-t-il une méthode intégrée ou de la bibliothèque standard en Python pour calculer la moyenne arithmétique (un type de moyenne) d'une liste de nombres ?

0 votes

La moyenne est ambiguë - le mode et la médiane sont également des moyennes couramment utilisées.

1 votes

Le mode et la médiane sont d'autres mesures de la tendance centrale. Ce ne sont pas des moyennes. Le mode est la valeur la plus courante observée dans un ensemble de données et n'est pas nécessairement unique. La médiane est la valeur qui représente le centre des points de données. Comme l'indique la question, il existe plusieurs types de moyennes, mais toutes sont différentes des calculs de la médiane et du mode. purplemath.com/modules/meanmode.htm

0 votes

@Jarom Ce lien est en désaccord avec vous : "La moyenne, la médiane et le mode sont trois types de "moyennes"".

288voto

NPE Points 169956

Je ne suis pas au courant de quoi que ce soit dans la bibliothèque standard. Cependant, vous pourriez utiliser quelque chose comme :

def mean(numbers):
    return float(sum(numbers)) / max(len(numbers), 1)

>>> mean([1,2,3,4])
2.5
>>> mean([])
0.0

Dans numpy, il y a numpy.mean() .

21 votes

Une chose courante est de considérer que la moyenne de [] es 0 ce qui peut être fait par float(sum(l))/max(len(l),1) .

9 votes

PEP 8 dit que l est un mauvais nom de variable car il ressemble beaucoup à 1 . Aussi, j'utiliserais if l plutôt que if len(l) > 0 . Voir ici

1 votes

Pourquoi avez-vous appelé max ?

194voto

Bengt Points 2327

NumPy possède un numpy.mean qui est une moyenne arithmétique. L'utilisation est aussi simple que cela :

>>> import numpy
>>> a = [1, 2, 4]
>>> numpy.mean(a)
2.3333333333333335

6 votes

Numpy est un cauchemar à installer dans un virtualenv. Vous devriez vraiment envisager de ne pas utiliser cette librairie

0 votes

S'il existe une installation numpy à l'échelle du système, vous pouvez probablement utiliser sa moyenne.

48 votes

@vcarel : "numpy est un cauchemar à installer dans un virtualenv". Je ne suis pas sûr de savoir pourquoi vous dites cela. C'était le cas avant, mais depuis un an ou plus, c'est très facile.

187voto

kirbyfan64sos Points 1656

Utilisez statistics.mean :

import statistics
print(statistics.mean([1,2,4])) # 2.3333333333333335

Il est disponible depuis Python 3.4. Pour les utilisateurs de 3.1-3.3, une ancienne version du module est disponible sur PyPI sous le nom de stats . Changez juste statistics a stats .

2 votes

Notez que cette solution est extrêmement lente par rapport aux autres solutions. Comparez timeit("numpy.mean(vec)) , timeit("sum(vec)/len(vec)") et timeit("statistics.mean(vec)") - ce dernier est plus lent que les autres par un facteur énorme (>100 dans certains cas sur mon PC). Cela semble être dû à une implémentation particulièrement précise de la fonction sum opérateur en statistics voir PEP et Code . Je ne suis pas sûr de la raison de la grande différence de performances entre statistics._sum et numpy.sum mais

10 votes

@jhin c'est parce que le statistics.mean essaie d'être correct . Il calcule correctement la moyenne de [1e50, 1, -1e50] * 1000 .

1 votes

statistics.mean acceptera également une expression de générateur de valeurs, que toutes les solutions qui utilisent len() pour le diviseur s'étouffera.

55voto

Mumon Points 87

Vous n'avez même pas besoin de numpy ou scipy...

>>> a = [1, 2, 3, 4, 5, 6]
>>> print(sum(a) / len(a))
3

24 votes

Alors mean([2,3]) donnerait 2. Soyez prudent avec les flottants. Utilisez plutôt float(sum(l))/len(l). Mieux encore, prenez soin de vérifier si la liste est vide.

15 votes

@jesusiniesta sauf dans python3, où la division fait ce qu'elle est censée faire : diviser.

12 votes

Et dans Python 2.2+ si vous from __future__ import division en tête de votre programme

8voto

Elendurwen Points 133

Utilisez scipy :

import scipy;
a=[1,2,4];
print(scipy.mean(a));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X