Calcolo della media aritmetica (un tipo di media) in Python


268

Esiste un metodo di libreria integrato o standard in Python per calcolare la media aritmetica (un tipo di media) di un elenco di numeri?


La media è ambigua - anche la modalità e la mediana sono medie comunemente usate
jtlz2

Modalità e mediana sono altre misure di tendenza centrale. Non sono medie. La modalità è il valore più comune visto in un set di dati e non è necessariamente univoco. La mediana è il valore che rappresenta il centro dei punti dati. Come suggerisce la domanda, ci sono alcuni tipi diversi di medie, ma tutti sono diversi dai calcoli mediani e di modalità. purplemath.com/modules/meanmode.htm
Giarom

@Jarom Quel collegamento non è d'accordo con te: 'Media, mediana e modalità sono tre tipi di "medie"'
Marcelo Cantos

Risposte:


285

Non sono a conoscenza di nulla nella libreria standard. Tuttavia, potresti usare qualcosa come:

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

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

In intorpidimento, c'è numpy.mean().


20
Una cosa comune è considerare che la media di []è 0, che può essere fatta da float(sum(l))/max(len(l),1).
giovedì

8
PEP 8 afferma che lè un nome variabile errato perché assomiglia molto 1. Inoltre, userei if lpiuttosto che if len(l) > 0. Vedi qui
zondo

1
Perché hai chiamato max?
1 -_-

3
Vedi la domanda sopra: Per evitare la divisione per zero (per [])
Simon Fakir,

5
Le liste vuote non hanno alcun significato. Per favore, non fingere che lo facciano.
Marcelo Cantos,

193

NumPy ha una numpy.meanmedia aritmetica. L'utilizzo è semplice come questo:

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

6
numpy è un incubo da installare in un virtualenv. Dovresti davvero considerare di non usare questa lib
vcarel il

46
@vcarel: "numpy è un incubo da installare in un virtualenv". Non sono sicuro del motivo per cui lo dici. Una volta era il caso, ma per l'ultimo anno o più è stato molto facile.

6
Devo rispondere a questo commento. Attualmente sto usando numpy in un virtualenv in OSX e non c'è assolutamente nessun problema (attualmente sto usando CPython 3.5).
Juan Carlos Coto,

4
Con sistemi di integrazione continua come Travis CI, l'installazione di numpy richiede alcuni minuti in più. Se la costruzione rapida e leggera è preziosa per te e hai solo bisogno della media, considera.
Akseli Palén

2
Gli ambienti virtuali @ AkseliPalén su Travis CI possono usare un numpy installato tramite apt-get usando i pacchetti del sito di sistema . Questo può essere abbastanza veloce da usare anche se è necessario solo un mezzo.
Bengt,

184

Utilizzare statistics.mean:

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

È disponibile da Python 3.4. Per gli utenti 3.1-3.3, una versione precedente del modulo è disponibile su PyPI con il nome stats. Passa statisticsa stats.


2
Si noti che questo è estremamente lento rispetto alle altre soluzioni. Confronta timeit("numpy.mean(vec)), timeit("sum(vec)/len(vec)")e timeit("statistics.mean(vec)")- il secondo è più lento degli altri per un fattore enorme (> 100 in alcuni casi sul mio PC). Ciò sembra essere dovuto a un'implementazione particolarmente precisa sumdell'operatore in statistics, vedi PEP e Codice . Non sono sicuro del motivo della grande differenza di prestazioni tra statistics._sume numpy.sum, comunque.
jhin,

10
@jhin questo è perché il statistics.meantentativo di essere corretto . Calcola correttamente la media di [1e50, 1, -1e50] * 1000.
Antti Haapala,

1
statistics.meanaccetterà anche un'espressione generatrice di valori, che tutte le soluzioni che usano len()per il divisore si strozzeranno.
PaulMcG,

54

Non hai nemmeno bisogno di intorpidimento o scipy ...

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

24
quindi mean ([2,3]) darebbe 2. fare attenzione con i float. Meglio usare float (sum (l)) / len (l). Meglio ancora, fai attenzione a controllare se l'elenco è vuoto.
jesusiniesta,

14
@jesusiniesta tranne in python3, dove la divisione fa quello che deve fare: divide
yota

11
E in Python 2.2+ se sei from __future__ import divisionin cima al tuo programma
spiffytech,

Che dire di grandi numeri e overflow?
obayhan,

Che dire a = list()? Il codice proposto risulta in ZeroDivisionError.
Ioannis Filippidis,


7

Invece di lanciare il float puoi fare quanto segue

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

o usando lambda

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

AGGIORNAMENTI: 15-12-2019

Python 3.8 ha aggiunto la funzione fmean al modulo statistico . Che è più veloce e restituisce sempre float.

Converti i dati in float e calcola la media aritmetica.

Funziona più velocemente della funzione mean () e restituisce sempre un float. I dati possono essere una sequenza o iterabili. Se il set di dati di input è vuoto, genera un StatisticsError.

fmean ([3.5, 4.0, 5.25])

4.25

Novità nella versione 3.8.


2
from statistics import mean
avarage=mean(your_list)

per esempio

from statistics import mean

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

e il risultato è

3.0

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

Esempi:

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

print(avg(l1)) # 9.0
print(avg(l2)) # 0.0

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)

0

Ho sempre pensato che avgfosse omesso dai builtin / stdlib perché è semplice come

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

e tutti gli avvertimenti sarebbero già stati risolti nel codice chiamante per l'uso locale .

Avvertenze importanti:

  1. risultato non float: in python2, 9/4 è 2. per risolvere, usare float(sum(L))/len(L)ofrom __future__ import division

  2. divisione per zero: l'elenco potrebbe essere vuoto. risolvere:

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

0

La risposta corretta alla tua domanda è usare statistics.mean. Ma per divertimento, ecco una versione di mean che non usa la len()funzione, quindi (come statistics.mean) può essere usata su generatori, che non supportano 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)))

-2

Altri hanno già pubblicato ottime risposte, ma alcune persone potrebbero ancora cercare un modo classico per trovare Mean (avg), quindi qui inserisco questo (codice testato in 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.