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

268

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

jrdioko
la source
La moyenne est ambiguë - le mode et la médiane sont également des moyennes couramment utilisées
jtlz2
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 la question l'indique, il existe différents types de moyennes, mais tous diffèrent des calculs de médiane et de mode. purplemath.com/modules/meanmode.htm
Jarom
@Jarom Ce lien n'est pas d'accord avec vous: 'La moyenne, la médiane et le mode sont trois types de "moyennes"'
Marcelo Cantos

Réponses:

285

Je ne suis au courant de rien dans la bibliothèque standard. Cependant, vous pouvez 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

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

NPE
la source
20
Une chose courante est de considérer que la moyenne de []est 0, ce qui peut être fait par float(sum(l))/max(len(l),1).
yo '12
8
PEP 8 dit que lc'est un mauvais nom de variable car il ressemble tellement 1. Aussi, j'utiliserais if lplutôt que if len(l) > 0. Voir ici
zondo
1
Pourquoi as-tu appelé max?
1 -_-
3
Voir la question ci-dessus: Pour éviter la division par zéro (pour [])
Simon Fakir
5
Les listes vides n'ont aucun moyen. S'il vous plaît, ne faites pas semblant.
Marcelo Cantos
193

NumPy a un numpy.meanqui est une moyenne arithmétique. L'utilisation est aussi simple que cela:

>>> import numpy
>>> a = [1, 2, 4]
>>> numpy.mean(a)
2.3333333333333335
Bengt
la source
6
numpy est un cauchemar à installer dans un virtualenv. Vous devriez vraiment envisager de ne pas utiliser cette lib
vcarel
46
@vcarel: "numpy est un cauchemar à installer dans un virtualenv". Je ne sais pas pourquoi tu dis ça. C'était le cas auparavant, mais depuis un an ou plus, cela a été très facile.
6
Je dois appuyer ce commentaire. J'utilise actuellement numpy dans un virtualenv dans OSX, et il n'y a absolument aucun problème (en utilisant actuellement CPython 3.5).
Juan Carlos Coto
4
Avec des systèmes d'intégration continue comme Travis CI, l'installation de numpy prend plusieurs minutes supplémentaires. Si une construction rapide et légère vous est précieuse et que vous n'avez besoin que de la moyenne, considérez.
Akseli Palén
2
@ Les environnements virtuels AkseliPalén sur Travis CI peuvent utiliser un numpy installé via apt-get en utilisant les packages du site système . Cela peut être assez rapide à utiliser même si l'on n'a besoin que d'une moyenne.
Bengt
184

Utilisation statistics.mean:

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

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

kirbyfan64sos
la source
2
Notez que cela est extrêmement lent 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 l' sumopérateur dans statistics, voir PEP et Code . Je ne suis pas sûr de la raison de la grande différence de performances entre statistics._sumet numpy.sum, cependant.
jhin
10
@jhin c'est parce que le statistics.meanessaye d'être correct . Il calcule correctement la moyenne de [1e50, 1, -1e50] * 1000.
Antti Haapala
1
statistics.meanacceptera également une expression de générateur de valeurs, que toutes les solutions qui utilisent len()pour le diviseur s'étoufferont.
PaulMcG
54

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

>>> a = [1, 2, 3, 4, 5, 6]
>>> print(sum(a) / len(a))
3
Mumon
la source
24
alors moyenne ([2,3]) donnerait 2. soyez prudent avec les flotteurs. Mieux vaut utiliser float (sum (l)) / len (l). Mieux encore, veillez à vérifier si la liste est vide.
jesusiniesta
14
@jesusiniesta sauf en python3, où la division fait ce qu'elle est censée faire: diviser
yota
11
Et en Python 2.2+ si vous êtes from __future__ import divisionau sommet de votre programme
spiffytech
Qu'en est-il des grands nombres et des débordements?
obayhan
Et alors a = list()? Le code proposé se traduit par ZeroDivisionError.
Ioannis Filippidis
7

Au lieu de lancer pour flotter, vous pouvez suivre

def mean(nums):
    return sum(nums, 0.0) / len(nums)

ou en utilisant lambda

mean = lambda nums: sum(nums, 0.0) / len(nums)

MISES À JOUR: 2019-12-15

Python 3.8 a ajouté la fonction fmean au module de statistiques . Ce qui est plus rapide et renvoie toujours float.

Convertissez les données en flottants et calculez la moyenne arithmétique.

Cela s'exécute plus rapidement que la fonction mean () et renvoie toujours un flottant. Les données peuvent être une séquence ou itérables. Si l'ensemble de données d'entrée est vide, déclenche une StatisticsError.

fmean ([3.5, 4.0, 5.25])

4,25

Nouveau dans la version 3.8.

Vlad Bezden
la source
2
from statistics import mean
avarage=mean(your_list)

par exemple

from statistics import mean

my_list=[5,2,3,2]
avarage=mean(my_list)
print(avarage)

et le résultat est

3.0
fariborz najafi
la source
1
def avg(l):
    """uses floating-point division."""
    return sum(l) / float(len(l))

Exemples:

l1 = [3,5,14,2,5,36,4,3]
l2 = [0,0,0]

print(avg(l1)) # 9.0
print(avg(l2)) # 0.0
jasonleonhard
la source
1
def list_mean(nums):
    sumof = 0
    num_of = len(nums)
    mean = 0
    for i in nums:
        sumof += i
    mean = sumof / num_of
    return float(mean)
Muhoza yves
la source
0

J'ai toujours supposé qu'il avgest omis dans les buildins / stdlib car c'est aussi simple que

sum(L)/len(L) # L is some list

et toute mise en garde serait déjà traitée dans le code de l'appelant pour une utilisation locale .

Mises en garde notables:

  1. résultat non flottant: en python2, 9/4 est 2. pour résoudre, utiliser float(sum(L))/len(L)oufrom __future__ import division

  2. division par zéro: la liste peut être vide. résoudre:

    if not L:
        raise WhateverYouWantError("foo")
    avg = float(sum(L))/len(L)
n611x007
la source
0

La bonne réponse à votre question est d'utiliser statistics.mean. Mais pour le plaisir, voici une version de mean qui n'utilise pas la len()fonction, donc elle (comme statistics.mean) peut être utilisée sur des générateurs, qui ne supportent pas len():

from functools import reduce
from operator import truediv
def ave(seq):
    return truediv(*reduce(lambda a, b: (a[0] + b[1], b[0]), 
                           enumerate(seq, start=1), 
                           (0, 0)))
PaulMcG
la source
-2

D'autres ont déjà posté de très bonnes réponses, mais certaines personnes pourraient toujours chercher un moyen classique de trouver Mean (avg), alors ici je poste ceci (code testé en Python 3.6):

def meanmanual(listt):

mean = 0
lsum = 0
lenoflist = len(listt)

for i in listt:
    lsum += i

mean = lsum / lenoflist
return float(mean)

a = [1, 2, 3, 4, 5, 6]
meanmanual(a)

Answer: 3.5
Hashmatullah Noorzai
la source