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?

jrdioko
quelle
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:

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().

NPE
quelle
20
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
Bengt
quelle
6
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.
Akseli Palén
2
@ AkseliPalén Virtuelle Umgebungen auf Travis CI können eine über apt-get installierte Nummer verwenden, die die System-Site-Pakete verwendet . Dies kann schnell genug sein, um verwendet zu werden, selbst wenn man nur einen Mittelwert benötigt.
Bengt
184

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 statisticszu stats.

kirbyfan64sos
quelle
2
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.
PaulMcG
54

Sie brauchen nicht einmal Numpy oder Scipy ...

>>> a = [1, 2, 3, 4, 5, 6]
>>> print(sum(a) / len(a))
3
Mumon
quelle
24
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.
Ioannis Filippidis
7

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.

Vlad Bezden
quelle
2
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
fariborz najafi
quelle
1
def avg(l):
    """uses floating-point division."""
    return sum(l) / float(len(l))

Beispiele:

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

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

Ich habe immer angenommen, dass avges 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:

  1. Nicht-Float-Ergebnis: In Python2 ist 9/4 2. zum Auflösen, Verwenden von float(sum(L))/len(L)oderfrom __future__ import division

  2. Division durch Null: Die Liste ist möglicherweise leer. lösen:

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

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)))
PaulMcG
quelle
-2

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
Hashmatullah Noorzai
quelle