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:

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


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

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.


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

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.


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

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

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

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)

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

-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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.