Cálculo de la media aritmética (un tipo de promedio) en Python

268

¿Existe un método de biblioteca incorporado o estándar en Python para calcular la media aritmética (un tipo de promedio) de una lista de números?

jrdioko
fuente
El promedio es ambiguo: la moda y la mediana también son promedios de uso común
jtlz2
La moda y la mediana son otras medidas de tendencia central. No son promedios. El modo es el valor más común visto en un conjunto de datos y no es necesariamente único. La mediana es el valor que representa el centro de los puntos de datos. Como la pregunta implica, hay algunos tipos diferentes de promedios, pero todos son diferentes de los cálculos de mediana y moda. purplemath.com/modules/meanmode.htm
Jarom
@Jarom Ese enlace no está de acuerdo con usted: "La media, la mediana y la moda son tres tipos de" promedios ""
Marcelo Cantos

Respuestas:

285

No tengo conocimiento de nada en la biblioteca estándar. Sin embargo, podría usar algo como:

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

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

En numpy, hay numpy.mean().

NPE
fuente
20
Una cosa común es considerar que el promedio de []es 0, que puede hacerse por float(sum(l))/max(len(l),1).
yo'
8
PEP 8 dice que les un nombre de variable incorrecto porque se parece mucho a él 1. Además, usaría en if llugar de if len(l) > 0. Ver aquí
zondo
1
¿Por qué has llamado max?
1 -_-
3
Vea la pregunta anterior: Para evitar la división por cero (para [])
Simon Fakir
55
Las listas vacías no tienen significado. Por favor, no finjas que lo hacen.
Marcelo Cantos
193

NumPy tiene un numpy.meanque es una media aritmética. El uso es tan simple como esto:

>>> import numpy
>>> a = [1, 2, 4]
>>> numpy.mean(a)
2.3333333333333335
Bengt
fuente
66
Numpy es una pesadilla para instalar en un virtualenv. Realmente deberías considerar no usar esta lib
vcarel
46
@vcarel: "numpy es una pesadilla para instalar en un virtualenv". No estoy seguro de por qué dices esto. Solía ​​ser el caso, pero durante el último año o más ha sido muy fácil.
66
Debo secundar este comentario. Actualmente estoy usando numpy en un virtualenv en OSX, y no hay absolutamente ningún problema (actualmente uso CPython 3.5).
Juan Carlos Coto
44
Con sistemas de integración continua como Travis CI, la instalación de numpy lleva varios minutos adicionales. Si la construcción rápida y ligera es valiosa para usted, y solo necesita la media, considere.
Akseli Palén
2
@ Los entornos virtuales de AkseliPalem en Travis CI pueden usar un numpy instalado a través de apt-get usando los paquetes del sitio del sistema . Esto puede ser lo suficientemente rápido como para usarlo incluso si solo se necesita un medio.
Bengt
184

Uso statistics.mean:

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

Está disponible desde Python 3.4. Para los usuarios 3.1-3.3, una versión anterior del módulo está disponible en PyPI bajo el nombre stats. Solo cambia statisticsa stats.

kirbyfan64sos
fuente
2
Tenga en cuenta que esto es extremadamente lento en comparación con las otras soluciones. Compare timeit("numpy.mean(vec)), timeit("sum(vec)/len(vec)")y timeit("statistics.mean(vec)")- este último es más lento que los demás por un factor enorme (> 100 en algunos casos en mi PC). Esto parece deberse a una implementación particularmente precisa del sumoperador statistics, ver PEP y Código . Sin embargo, no estoy seguro de la razón de la gran diferencia de rendimiento entre statistics._sumy numpy.sum.
jhin
10
@jhin esto se debe a que statistics.meanintenta ser correcto . Calcula correctamente la media de [1e50, 1, -1e50] * 1000.
Antti Haapala
1
statistics.meantambién aceptará una expresión generadora de valores, que todas las soluciones que usan len()para el divisor se ahogarán.
PaulMcG
54

Ni siquiera necesitas numpy o scipy ...

>>> a = [1, 2, 3, 4, 5, 6]
>>> print(sum(a) / len(a))
3
Mumon
fuente
24
entonces media ([2,3]) daría 2. ten cuidado con las carrozas. Mejor use float (sum (l)) / len (l). Mejor aún, tenga cuidado de verificar si la lista está vacía.
jesusiniesta
14
@jesusiniesta excepto en python3, donde la división hace lo que debe hacer: dividir
yota
11
Y en Python 2.2+ si está from __future__ import divisionen la parte superior de su programa
spiffytech
¿Qué pasa con los grandes números y el desbordamiento?
obayhan
¿Qué hay de a = list()? El código propuesto da como resultado ZeroDivisionError.
Ioannis Filippidis
7

En lugar de lanzar para flotar, puedes hacer lo siguiente

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

o usando lambda

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

ACTUALIZACIONES: 2019-12-15

Python 3.8 agregó la función fmean al módulo de estadísticas . Que es más rápido y siempre devuelve flotante.

Convierta datos en flotantes y calcule la media aritmética.

Esto se ejecuta más rápido que la función mean () y siempre devuelve un flotante. Los datos pueden ser una secuencia o iterables. Si el conjunto de datos de entrada está vacío, genera un StatisticsError.

fmean ([3.5, 4.0, 5.25])

4.25

Nuevo en la versión 3.8.

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

por ejemplo

from statistics import mean

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

y el resultado es

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

Ejemplos:

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

print(avg(l1)) # 9.0
print(avg(l2)) # 0.0
jasonleonhard
fuente
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
fuente
0

Siempre supuse que avgse omite de builtins / stdlib porque es tan simple como

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

y cualquier advertencia ya se abordaría en el código de llamada para uso local .

Advertencias notables:

  1. resultado no flotante: en python2, 9/4 es 2. para resolver, usar float(sum(L))/len(L)ofrom __future__ import division

  2. división por cero: la lista puede estar vacía. resolver:

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

La respuesta adecuada a su pregunta es usar statistics.mean. Pero por diversión, aquí hay una versión de mean que no usa la len()función, por lo que (like statistics.mean) se puede usar en generadores, que no admiten 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
fuente
-2

Otros ya publicaron muy buenas respuestas, pero algunas personas aún podrían estar buscando una forma clásica de encontrar Mean (promedio), así que aquí publico esto (código probado 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
fuente