Średnia jest dwuznaczna - tryb i mediana są również często używanymi średnimi
jtlz2
Tryb i mediana to inne miary tendencji centralnej. Nie są to średnie. Tryb ten jest najczęściej spotykaną wartością w zestawie danych i niekoniecznie jest unikalny. Mediana to wartość reprezentująca środek punktów danych. Jak sugeruje to pytanie, istnieje kilka różnych typów średnich, ale wszystkie różnią się od obliczeń mediany i trybu. purplemath.com/modules/meanmode.htm
Jarom
@Jarom Ten link nie zgadza się z tobą: „Średnia, mediana i tryb to trzy rodzaje„ średnich ”
Marcelo Cantos
Odpowiedzi:
284
Nic nie wiem w standardowej bibliotece. Możesz jednak użyć czegoś takiego:
numpy to koszmar do zainstalowania w virtualenv. Naprawdę powinieneś rozważyć nieużywanie tego lib
vcarel
46
@vcarel: „numpy to koszmar do zainstalowania w virtualenv”. Nie jestem pewien, dlaczego to mówisz. Kiedyś tak było, ale przez ostatni rok lub dłużej było to bardzo łatwe.
6
Muszę poprzeć ten komentarz. Obecnie używam numpy w virtualenv w OSX i absolutnie nie ma problemu (obecnie używam CPython 3.5).
Juan Carlos Coto
4
W systemach ciągłej integracji, takich jak Travis CI, instalacja numpy zajmuje kilka dodatkowych minut. Jeśli szybka i lekka kompilacja jest dla Ciebie cenna i potrzebujesz tylko środka, zastanów się.
Jest dostępny od wersji Python 3.4. Dla użytkowników 3.1-3.3 stara wersja modułu jest dostępna w PyPI pod nazwą stats. Po prostu zmień statisticsna stats.
Zauważ, że jest to bardzo wolne w porównaniu do innych rozwiązań. Porównać timeit("numpy.mean(vec)), timeit("sum(vec)/len(vec)")i timeit("statistics.mean(vec)")- ten ostatni jest wolniejszy niż inni przez ogromny czynnik (> 100 w niektórych przypadkach na moim komputerze). Wydaje się, że wynika to ze szczególnie precyzyjnej implementacji sumoperatora statistics, patrz PEP i Kodeks . Nie jestem jednak pewien przyczyny dużej różnicy wydajności między statistics._sumi numpy.sum.
jhin
10
@jhin to dlatego, że statistics.meanpróbuje być poprawny . Oblicza poprawnie średnią [1e50, 1, -1e50] * 1000.
Antti Haapala
1
statistics.meanzaakceptuje również generator wartości wyrażenia, na którym dławią się wszystkie rozwiązania stosowane len()dla dzielnika.
wtedy średnia ([2,3]) dałaby 2. uważaj na zmiennoprzecinkowe. Lepsze użycie float (suma (l)) / len (l). Jeszcze lepiej, uważaj, aby sprawdzić, czy lista jest pusta.
jesusiniesta
14
@jesusiniesta, z wyjątkiem python3, gdzie podział wykonuje to, co powinien: divide
yota
11
A w Python 2.2+, jeśli jesteś from __future__ import divisionna szczycie swojego programu
spiffytech
Co z dużymi liczbami i przepełnieniem?
obayhan
Co a = list()? Proponowany kod powoduje ZeroDivisionError.
Zamiast rzucać na spławik, możesz wykonać następujące czynności
def mean(nums):return sum(nums,0.0)/ len(nums)
lub za pomocą lambda
mean =lambda nums: sum(nums,0.0)/ len(nums)
AKTUALIZACJE: 15.12.2019
Python 3.8 dodał funkcję fmean do modułu statystyk . Co jest szybsze i zawsze zwraca liczbę zmiennoprzecinkową.
Konwertuj dane na zmiennoprzecinkowe i oblicz średnią arytmetyczną.
Działa to szybciej niż funkcja mean () i zawsze zwraca liczbę zmiennoprzecinkową. Dane mogą być sekwencją lub iterowalne. Jeśli wejściowy zestaw danych jest pusty, wywołuje błąd StatisticsError.
Prawidłowa odpowiedź na twoje pytanie to użycie statistics.mean. Ale dla zabawy, oto wersja środka, która nie korzysta z len()funkcji, więc (podobnie jak statistics.mean) może być używana w generatorach, które nie obsługują 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)))
Inni już opublikowali bardzo dobre odpowiedzi, ale niektórzy ludzie mogą nadal szukać klasycznego sposobu na znalezienie Mean (avg), więc tutaj zamieszczam (kod przetestowany w Pythonie 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
Odpowiedzi:
Nic nie wiem w standardowej bibliotece. Możesz jednak użyć czegoś takiego:
W numpy jest
numpy.mean()
.źródło
[]
to0
, co można zrobićfloat(sum(l))/max(len(l),1)
.l
jest to zła nazwa zmiennej, ponieważ tak bardzo przypomina1
. Również wolałbym użyćif l
niżif len(l) > 0
. Zobacz tutajmax
?NumPy ma
numpy.mean
średnią arytmetyczną. Użycie jest tak proste:źródło
Użyj
statistics.mean
:Jest dostępny od wersji Python 3.4. Dla użytkowników 3.1-3.3 stara wersja modułu jest dostępna w PyPI pod nazwą
stats
. Po prostu zmieństatistics
nastats
.źródło
timeit("numpy.mean(vec))
,timeit("sum(vec)/len(vec)")
itimeit("statistics.mean(vec)")
- ten ostatni jest wolniejszy niż inni przez ogromny czynnik (> 100 w niektórych przypadkach na moim komputerze). Wydaje się, że wynika to ze szczególnie precyzyjnej implementacjisum
operatorastatistics
, patrz PEP i Kodeks . Nie jestem jednak pewien przyczyny dużej różnicy wydajności międzystatistics._sum
inumpy.sum
.statistics.mean
próbuje być poprawny . Oblicza poprawnie średnią[1e50, 1, -1e50] * 1000
.statistics.mean
zaakceptuje również generator wartości wyrażenia, na którym dławią się wszystkie rozwiązania stosowanelen()
dla dzielnika.Nie potrzebujesz nawet numpy ani scipy ...
źródło
from __future__ import division
na szczycie swojego programua = list()
? Proponowany kod powodujeZeroDivisionError
.Użyj scipy:
źródło
Zamiast rzucać na spławik, możesz wykonać następujące czynności
lub za pomocą lambda
AKTUALIZACJE: 15.12.2019
Python 3.8 dodał funkcję fmean do modułu statystyk . Co jest szybsze i zawsze zwraca liczbę zmiennoprzecinkową.
źródło
na przykład
i wynik jest
źródło
Przykłady:
źródło
źródło
Zawsze przypuszczałem, że
avg
jest pominięty w wbudowanym / stdlib, ponieważ jest tak prosty jaka wszelkie zastrzeżenia zostaną już uwzględnione w kodzie dzwoniącym do użytku lokalnego .
Ważne zastrzeżenia:
wynik bez liczby zmiennoprzecinkowej: w python2 9/4 to 2. w celu rozwiązania, użycia
float(sum(L))/len(L)
lubfrom __future__ import division
dzielenie przez zero: lista może być pusta. rozwiązać:
źródło
Prawidłowa odpowiedź na twoje pytanie to użycie
statistics.mean
. Ale dla zabawy, oto wersja środka, która nie korzysta zlen()
funkcji, więc (podobnie jakstatistics.mean
) może być używana w generatorach, które nie obsługująlen()
:źródło
Inni już opublikowali bardzo dobre odpowiedzi, ale niektórzy ludzie mogą nadal szukać klasycznego sposobu na znalezienie Mean (avg), więc tutaj zamieszczam (kod przetestowany w Pythonie 3.6):
źródło