Gibt es in Python eine integrierte oder Standardbibliotheksmethode, um das arithmetische Mittel (eine Art von Durchschnitt) einer Liste von Zahlen zu berechnen?
Gibt es in Python eine integrierte oder Standardbibliotheksmethode, um das arithmetische Mittel (eine Art von Durchschnitt) einer Liste von Zahlen zu berechnen?
Antworten:
Mir ist nichts in der Standardbibliothek bekannt. Sie könnten jedoch Folgendes verwenden:
def mean(numbers):
return float(sum(numbers)) / max(len(numbers), 1)
>>> mean([1,2,3,4])
2.5
>>> mean([])
0.0
In numpy gibt es numpy.mean()
.
[]
ist 0
, was durch getan werden kann float(sum(l))/max(len(l),1)
.
max
?
NumPy hat numpy.mean
ein arithmetisches Mittel. Die Verwendung ist so einfach:
>>> import numpy
>>> a = [1, 2, 4]
>>> numpy.mean(a)
2.3333333333333335
Verwendung statistics.mean
:
import statistics
print(statistics.mean([1,2,4])) # 2.3333333333333335
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 statistics
zu stats
.
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 sum
Betreibers 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._sum
und numpy.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, die len()
für den Divisor verwendet werden, ersticken.
Sie brauchen nicht einmal Numpy oder Scipy ...
>>> a = [1, 2, 3, 4, 5, 6]
>>> print(sum(a) / len(a))
3
from __future__ import division
oben in Ihrem Programm stehen
a = list()
? Der vorgeschlagene Code führt zu ZeroDivisionError
.
Verwenden Sie scipy:
import scipy;
a=[1,2,4];
print(scipy.mean(a));
Anstatt zu schweben, können Sie folgen
def mean(nums):
return sum(nums, 0.0) / len(nums)
oder mit Lambda
mean = lambda nums: sum(nums, 0.0) / len(nums)
UPDATES: 15.12.2019
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.
fmean ([3.5, 4.0, 5.25])
4.25
Neu in Version 3.8.
from statistics import mean
avarage=mean(your_list)
beispielsweise
from statistics import mean
my_list=[5,2,3,2]
avarage=mean(my_list)
print(avarage)
und Ergebnis ist
3.0
def avg(l):
"""uses floating-point division."""
return sum(l) / float(len(l))
l1 = [3,5,14,2,5,36,4,3]
l2 = [0,0,0]
print(avg(l1)) # 9.0
print(avg(l2)) # 0.0
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)
Ich habe immer angenommen, dass avg
es in der Builtins / Stdlib weggelassen wird, weil es so einfach ist wie
sum(L)/len(L) # L is some list
und 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:
if not L:
raise WhateverYouWantError("foo")
avg = float(sum(L))/len(L)
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