Berechnung des arithmetischen Mittels (eine Art von Durchschnitt) in Python
267
Gibt es in Python eine integrierte oder Standardbibliotheksmethode, um das arithmetische Mittel (eine Art von Durchschnitt) einer Liste von Zahlen zu berechnen?
Der Durchschnitt ist nicht eindeutig - Modus und Median sind ebenfalls häufig verwendete Durchschnittswerte
jtlz2
Modus und Median sind weitere Maße für die zentrale Tendenz. Sie sind keine Durchschnittswerte. Der Modus ist der häufigste Wert in einem Datensatz und nicht unbedingt eindeutig. Der Median ist der Wert, der die Mitte der Datenpunkte darstellt. Wie die Frage impliziert, gibt es einige verschiedene Arten von Durchschnittswerten, die sich jedoch alle von Median- und Modusberechnungen unterscheiden. purplemath.com/modules/meanmode.htm
Jarom
@ Jarom Dieser Link stimmt nicht mit Ihnen überein: "Mittelwert, Median und Modus sind drei Arten von" Durchschnittswerten ""
Marcelo Cantos
Antworten:
284
Mir ist nichts in der Standardbibliothek bekannt. Sie könnten jedoch Folgendes verwenden:
Eine übliche Sache ist zu berücksichtigen, dass der Durchschnitt von []ist 0, was durch getan werden kann float(sum(l))/max(len(l),1).
yo
8
PEP 8 sagt, dass dies lein schlechter Variablenname ist, weil er so ähnlich aussieht 1. Auch würde ich if leher verwenden als if len(l) > 0. Siehe hier
Zondo
1
Warum hast du angerufen max?
1 -_-
3
Siehe die Frage oben: Um eine Division durch Null zu vermeiden (für [])
Simon Fakir
5
Leere Listen haben keinen Mittelwert. Bitte tun Sie nicht so.
Marcelo Cantos
193
NumPy hat numpy.meanein arithmetisches Mittel. Die Verwendung ist so einfach:
>>>import numpy
>>> a =[1,2,4]>>> numpy.mean(a)2.3333333333333335
numpy ist ein Albtraum, der in einer virtuellen Umgebung installiert werden muss. Sie sollten wirklich in Betracht ziehen, diese lib
vcarel
46
@vcarel: "numpy ist ein Albtraum, der in einer virtuellen Umgebung installiert werden muss". Ich bin mir nicht sicher, warum du das sagst. Früher war es so, aber seit mindestens einem Jahr ist es sehr einfach.
6
Ich muss diesen Kommentar unterstützen. Ich verwende derzeit numpy in einer virtuellen Umgebung unter OSX, und es gibt absolut kein Problem (derzeit wird CPython 3.5 verwendet).
Juan Carlos Coto
4
Bei kontinuierlichen Integrationssystemen wie Travis CI dauert die Installation von numpy einige zusätzliche Minuten. Wenn ein schneller und leichter Aufbau für Sie wertvoll ist und Sie nur den Mittelwert benötigen, sollten Sie überlegen.
Es ist seit Python 3.4 verfügbar. Für Benutzer von 3.1-3.3 ist eine alte Version des Moduls auf PyPI unter dem Namen verfügbar stats. Wechseln Sie einfach statisticszu stats.
Beachten Sie, dass dies im Vergleich zu den anderen Lösungen extrem langsam ist. Vergleichen Sie timeit("numpy.mean(vec)), timeit("sum(vec)/len(vec)")und timeit("statistics.mean(vec)")- letzteres ist um einen großen Faktor langsamer als die anderen (> 100 in einigen Fällen auf meinem PC). Dies scheint auf eine besonders genaue Implementierung des sumBetreibers in zurückzuführen zu sein statistics, siehe PEP und Code . Ich bin mir jedoch nicht sicher über den Grund für den großen Leistungsunterschied zwischen statistics._sumund numpy.sum.
Jhin
10
@jhin das liegt daran, dass das statistics.meanversucht richtig zu sein . Es berechnet den Mittelwert von korrekt [1e50, 1, -1e50] * 1000.
Antti Haapala
1
statistics.meanakzeptiert auch einen Generatorausdruck von Werten, an dem alle Lösungen, die len()für den Divisor verwendet werden, ersticken.
dann würde mean ([2,3]) 2. geben, sei vorsichtig mit Schwimmern. Verwenden Sie besser float (sum (l)) / len (l). Überprüfen Sie noch besser, ob die Liste leer ist.
Jesusiniesta
14
@ Jesusiniesta außer in Python3, wo Division tut, was es tun soll: Teilen
Yota
11
Und in Python 2.2+, wenn Sie ganz from __future__ import divisionoben in Ihrem Programm stehen
spiffytech
Was ist mit großen Zahlen und Überlauf?
Obayhan
Was ist mit a = list()? Der vorgeschlagene Code führt zu ZeroDivisionError.
Python 3.8 hat dem Statistikmodul die Funktion fmean hinzugefügt . Welches ist schneller und gibt immer float zurück.
Konvertieren Sie Daten in Gleitkommazahlen und berechnen Sie das arithmetische Mittel.
Dies läuft schneller als die Funktion mean () und gibt immer einen float zurück. Die Daten können eine Sequenz oder iterierbar sein. Wenn das Eingabedatensatz leer ist, wird ein StatisticsError ausgelöst.
Die richtige Antwort auf Ihre Frage ist zu verwenden statistics.mean. Aber zum Spaß, hier ist eine Version von mean, die die len()Funktion nicht verwendet , so dass sie (wie statistics.mean) für Generatoren verwendet werden kann, die nicht unterstützen 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)))
Andere haben bereits sehr gute Antworten gepostet, aber einige Leute suchen möglicherweise noch nach einem klassischen Weg, um Mean (Durchschnitt) zu finden. Deshalb poste ich dies hier (Code getestet 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
Antworten:
Mir ist nichts in der Standardbibliothek bekannt. Sie könnten jedoch Folgendes verwenden:
In numpy gibt es
numpy.mean()
.quelle
[]
ist0
, was durch getan werden kannfloat(sum(l))/max(len(l),1)
.l
ein schlechter Variablenname ist, weil er so ähnlich aussieht1
. Auch würde ichif l
eher verwenden alsif len(l) > 0
. Siehe hiermax
?NumPy hat
numpy.mean
ein arithmetisches Mittel. Die Verwendung ist so einfach:quelle
Verwendung
statistics.mean
:Es ist seit Python 3.4 verfügbar. Für Benutzer von 3.1-3.3 ist eine alte Version des Moduls auf PyPI unter dem Namen verfügbar
stats
. Wechseln Sie einfachstatistics
zustats
.quelle
timeit("numpy.mean(vec))
,timeit("sum(vec)/len(vec)")
undtimeit("statistics.mean(vec)")
- letzteres ist um einen großen Faktor langsamer als die anderen (> 100 in einigen Fällen auf meinem PC). Dies scheint auf eine besonders genaue Implementierung dessum
Betreibers in zurückzuführen zu seinstatistics
, siehe PEP und Code . Ich bin mir jedoch nicht sicher über den Grund für den großen Leistungsunterschied zwischenstatistics._sum
undnumpy.sum
.statistics.mean
versucht richtig zu sein . Es berechnet den Mittelwert von korrekt[1e50, 1, -1e50] * 1000
.statistics.mean
akzeptiert auch einen Generatorausdruck von Werten, an dem alle Lösungen, dielen()
für den Divisor verwendet werden, ersticken.Sie brauchen nicht einmal Numpy oder Scipy ...
quelle
from __future__ import division
oben in Ihrem Programm stehena = list()
? Der vorgeschlagene Code führt zuZeroDivisionError
.Verwenden Sie scipy:
quelle
Anstatt zu schweben, können Sie folgen
oder mit Lambda
UPDATES: 15.12.2019
Python 3.8 hat dem Statistikmodul die Funktion fmean hinzugefügt . Welches ist schneller und gibt immer float zurück.
quelle
beispielsweise
und Ergebnis ist
quelle
Beispiele:
quelle
quelle
Ich habe immer angenommen, dass
avg
es in der Builtins / Stdlib weggelassen wird, weil es so einfach ist wieund alle Vorbehalte würden bereits im Anrufercode für die lokale Verwendung behandelt .
Bemerkenswerte Einschränkungen:
Nicht-Float-Ergebnis: In Python2 ist 9/4 2. zum Auflösen, Verwenden von
float(sum(L))/len(L)
oderfrom __future__ import division
Division durch Null: Die Liste ist möglicherweise leer. lösen:
quelle
Die richtige Antwort auf Ihre Frage ist zu verwenden
statistics.mean
. Aber zum Spaß, hier ist eine Version von mean, die dielen()
Funktion nicht verwendet , so dass sie (wiestatistics.mean
) für Generatoren verwendet werden kann, die nicht unterstützenlen()
:quelle
Andere haben bereits sehr gute Antworten gepostet, aber einige Leute suchen möglicherweise noch nach einem klassischen Weg, um Mean (Durchschnitt) zu finden. Deshalb poste ich dies hier (Code getestet in Python 3.6):
quelle