numpy.mean, jeśli możesz sobie pozwolić na instalację numpy
mitch
7
sum(L) / float(len(L)). obsługiwać puste listy w kodzie dzwoniącym, takie jakif not L: ...
n611x007
4
@mitch: nie ma znaczenia, czy stać cię na instalację numpy. numpy to całe słowo samo w sobie. To, czy faktycznie potrzebujesz numpy. Zainstalowanie numpy, rozszerzenia C 16mb, do obliczania średnich byłoby, cóż, bardzo niepraktyczne, dla kogoś, kto nie używałby go do innych celów.
n611x007,
3
zamiast instalować cały pakiet numpy tylko dla avg / mean, jeśli używasz Pythona 3, możemy to zrobić za pomocą modułu statystycznego po prostu przez „ze średniej importu statystyki” lub jeśli na Pythonie 2.7 lub mniej, moduł statystyczny można pobrać z src: hg.python.org/cpython/file/default/Lib/statistics.py doc: docs.python.org/dev/library/statistics.html i używane bezpośrednio.
Jeśli lista składa się z wskazówki, The wynik pod python 2 będzie int
Mitch
To idealne ! przepraszam za głupie pytanie, ale naprawdę szukałem tego wszędzie! Dziękuję bardzo !
Carla Dessi
7
jak powiedziałem, jestem nowy w tym, myślałem, że będę musiał zrobić to z pętlą lub czymś, aby policzyć liczbę liczb w nim, nie zdawałem sobie sprawy, że mogę po prostu użyć długości. to pierwsza rzecz, którą zrobiłem z pythonem
Carla Dessi
2
co jeśli suma jest masywną liczbą, która nie zmieści się w int / float?
Użytkownik Foo Bar
5
@ FooBarUser, to powinieneś obliczyć k = 1,0 / len (l), a następnie zmniejszyć: zmniejsz (lambda x, y: x + y * k, l)
To jest dziwne. Zakładałbym, że byłoby to znacznie bardziej wydajne, ale wydaje się, że zajmuje 8 razy więcej czasu na losowej liście pływaków niż po prostusum(l)/len(l)
L. Amber O'Hearn
8
Och, ale np.array(l).mean()jest znacznie szybszy.
L. Amber O'Hearn,
8
@ L.AmberO'Hearn, po prostu go i czasowym np.mean(l)i np.array(l).meansą o tej samej prędkości, i sum(l)/len(l)jest około dwa razy szybciej. Użyłem l = list(np.random.rand(1000)), bo oczywiście obie numpymetody stają się znacznie szybsze, jeśli tak ljest numpy.array.
Akavall,
11
cóż, chyba że jest to jedyny powód instalacji numpy. instalacja pakietu 16 mb C dowolnej sławy do obliczeń średnich wygląda bardzo dziwnie w tej skali.
n611x007,
ale w mojej opinii. nie trzeba dbać o prędkość w normalnych warunkach ..
Jest to najbardziej elegancka odpowiedź, ponieważ wykorzystuje standardowy moduł biblioteczny, który jest dostępny od Pythona 3.4.
Serge Stroobandt,
4
I jest stabilny numerycznie
Antti Haapala
I to powoduje błąd ładniejszy jeśli przypadkowo przechodzić w pustej listy statistics.StatisticsError: mean requires at least one data pointzamiast bardziej tajemnicze ZeroDivisionError: division by zerodo sum(x) / len(x)rozwiązania.
Boris
45
Dlaczego miałbyś używać reduce()tego, skoro Python ma doskonale chrupiącą sum()funkcję?
print sum(l)/ float(len(l))
(Jest float()to konieczne, aby zmusić Python do dokonania podziału zmiennoprzecinkowego.)
Rozumiem, że to tylko dla zabawy, ale zwrócenie 0 dla pustej listy może nie być najlepszą rzeczą
Johan Lundberg
1
@JohanLundberg - Możesz zamienić 0 na False jako ostatni argument, reduce()który dałby Ci False dla pustej listy, w przeciwnym razie średnia jak poprzednio.
Andrew Clark,
@AndrewClark, dlaczego zmuszasz floatsię len?
EndermanAPM
8
Próbowałem użyć powyższych opcji, ale nie działałem. Spróbuj tego:
from statistics import mean
n =[11,13,15,17,19]print(n)print(mean(n))
To nie jest pytanie o pandę, więc importowanie tak ciężkiej biblioteki wydaje się nadmierne w przypadku prostej operacji, takiej jak znalezienie środka.
cs95
4
Miałem podobne pytanie do rozwiązania w przypadku problemów Udacity. Zamiast wbudowanej funkcji kodowałem:
Dobrze. Każda inna odpowiedź nie zauważyła zagrożenia pustej listy!
wsysuper
1
Zwracanie False(odpowiednik liczby całkowitej 0) jest najgorszym możliwym sposobem obsługi tego błędu. Lepiej złapać ZeroDivisionErrori wychować coś lepszego (być może ValueError).
uprzejmie
@kindall, w jaki sposób jest ValueErrorlepszy od ZeroDivisionError? To drugie jest bardziej szczegółowe, a ponadto wydaje się, że złapanie błędu arytmetycznego nie jest konieczne, aby ponownie rzucić inny.
MatTheWhale
Ponieważ ZeroDivisionErrorjest przydatna tylko jeśli wiesz jak kalkulacja jest wykonywana (czyli, że podział przez długość listy jest zaangażowany). Jeśli tego nie wiesz, to nie mówi ci, na czym polega problem z przekazaną wartością. Podczas gdy twój nowy wyjątek może zawierać te bardziej szczegółowe informacje.
kindall
4
jako początkujący właśnie kodowałem to:
L =[15,18,2,36,12,78,5,6,9]
total =0def average(numbers):
total = sum(numbers)
total = float(total)return total / len(numbers)print average(L)
Aby użyć reducedo obliczenia średniej bieżącej, musisz śledzić całkowitą, ale także całkowitą liczbę elementów do tej pory widoczną. ponieważ nie jest to trywialny element na liście, musisz również reducepodać dodatkowy argument, aby go spasować.
Oba mogą dać ci zbliżone wartości na liczbach całkowitych lub co najmniej 10 wartości dziesiętnych. Ale jeśli naprawdę zastanawiasz się nad długimi zmiennymi wartościami, obie mogą być różne. Podejście może się różnić w zależności od tego, co chcesz osiągnąć.
>>> l =[15,18,2,36,12,78,5,6,9]>>>print reduce(lambda x, y: x + y, l)/ len(l)20>>> sum(l)/len(l)20
Wartości zmiennoprzecinkowe
>>>print reduce(lambda x, y: x + y, l)/ float(len(l))20.1111111111>>>print sum(l)/float(len(l))20.1111111111
x = [[-5.01,-5.43,1.08,0.86,-2.67,4.94,-2.51,-2.25,5.56,1.03],
[-8.12,-3.48,-5.52,-3.78,0.63,3.29,2.09,-2.13,2.86,-3.33],
[-3.68,-3.54,1.66,-4.11,7.39,2.08,-2.59,-6.94,-2.26,4.33]]
możesz zauważyć, że xma wymiar 3 * 10, jeśli potrzebujesz dostać się meando każdego wiersza, możesz to wpisać
Łącząc kilka powyższych odpowiedzi, wymyśliłem następujące, które działają z redukcją i nie zakładają, że masz Ldostęp do funkcji redukcji:
from operator import truediv
L =[15,18,2,36,12,78,5,6,9]def sum_and_count(x, y):try:return(x[0]+ y, x[1]+1)exceptTypeError:return(x + y,2)
truediv(*reduce(sum_and_count, L))# prints 20.11111111111111
numbers =[0,1,2,3]
numbers[0]= input("Please enter a number")
numbers[1]= input("Please enter a second number")
numbers[2]= input("Please enter a third number")
numbers[3]= input("Please enter a fourth number")print(numbers)print("Finding the Avarage")
avarage = int(numbers[0])+ int(numbers[1])+ int(numbers[2])+ int(numbers [3])/4print(avarage)
sum(L) / float(len(L))
. obsługiwać puste listy w kodzie dzwoniącym, takie jakif not L: ...
Odpowiedzi:
W Pythonie 3.4+ możesz używać
statistics.mean()
W starszych wersjach Pythona możesz to zrobić
W Pythonie 2 musisz przekonwertować
len
na zmiennoprzecinkowe, aby uzyskać podział zmiennoprzecinkowyNie ma potrzeby używania
reduce
. Jest znacznie wolniejszy i został usunięty w Pythonie 3.źródło
źródło
from __future__ import division
, możesz wyeliminować to brzydkiefloat
.float
jest brzydka jak diabli, po prostu chciałam to uprościć.sum(l, 0.0) / len(l)
sum(l) / len(l)
Możesz użyć
numpy.mean
:źródło
sum(l)/len(l)
np.array(l).mean()
jest znacznie szybszy.np.mean(l)
inp.array(l).mean
są o tej samej prędkości, isum(l)/len(l)
jest około dwa razy szybciej. Użyłeml = list(np.random.rand(1000))
, bo oczywiście obienumpy
metody stają się znacznie szybsze, jeśli takl
jestnumpy.array
.Statystyki moduł został dodany do Pythona 3.4 . Ma funkcję obliczania średniej zwanej średnią . Przykład z podaną listą to:
źródło
statistics.StatisticsError: mean requires at least one data point
zamiast bardziej tajemniczeZeroDivisionError: division by zero
dosum(x) / len(x)
rozwiązania.Dlaczego miałbyś używać
reduce()
tego, skoro Python ma doskonale chrupiącąsum()
funkcję?(Jest
float()
to konieczne, aby zmusić Python do dokonania podziału zmiennoprzecinkowego.)źródło
float()
nie jest konieczne w Pythonie 3.Jeśli używasz Pythona> = 3.4, istnieje biblioteka statystyk
https://docs.python.org/3/library/statistics.html
Możesz użyć metody podanej w ten sposób. Załóżmy, że masz listę liczb, których średnią chcesz znaleźć: -
Ma też inne metody, takie jak stdev, wariancja, tryb, średnia harmoniczna, mediana itp., Które są zbyt przydatne.
źródło
Zamiast rzutować na zmiennoprzecinkowe, możesz dodać 0,0 do sumy:
źródło
sum(l) / float(len(l))
jest właściwą odpowiedzią, ale tylko dla kompletności możesz obliczyć średnią za pomocą jednego zmniejszenia:Pamiętaj, że może to spowodować niewielki błąd zaokrąglenia:
źródło
reduce()
który dałby Ci False dla pustej listy, w przeciwnym razie średnia jak poprzednio.float
sięlen
?Próbowałem użyć powyższych opcji, ale nie działałem. Spróbuj tego:
pracował na Pythonie 3.5
źródło
Lub stosowanie
pandas
jestSeries.mean
metoda:Próbny:
Z dokumentów:
A oto dokumenty na ten temat:
I cała dokumentacja:
źródło
Miałem podobne pytanie do rozwiązania w przypadku problemów Udacity. Zamiast wbudowanej funkcji kodowałem:
Znacznie dłużej niż zwykle, ale dla początkującego jest to dość trudne.
źródło
False
(odpowiednik liczby całkowitej0
) jest najgorszym możliwym sposobem obsługi tego błędu. Lepiej złapaćZeroDivisionError
i wychować coś lepszego (być możeValueError
).ValueError
lepszy odZeroDivisionError
? To drugie jest bardziej szczegółowe, a ponadto wydaje się, że złapanie błędu arytmetycznego nie jest konieczne, aby ponownie rzucić inny.ZeroDivisionError
jest przydatna tylko jeśli wiesz jak kalkulacja jest wykonywana (czyli, że podział przez długość listy jest zaangażowany). Jeśli tego nie wiesz, to nie mówi ci, na czym polega problem z przekazaną wartością. Podczas gdy twój nowy wyjątek może zawierać te bardziej szczegółowe informacje.jako początkujący właśnie kodowałem to:
źródło
sum(l)/len(l)
jest zdecydowanie najbardziej elegancką odpowiedzią (nie trzeba wykonywać konwersji typów w Pythonie 3).Jeśli chcesz uzyskać więcej niż tylko średnią (aka średnią), możesz sprawdzić scipy statystyki
źródło
Aby użyć
reduce
do obliczenia średniej bieżącej, musisz śledzić całkowitą, ale także całkowitą liczbę elementów do tej pory widoczną. ponieważ nie jest to trywialny element na liście, musisz równieżreduce
podać dodatkowy argument, aby go spasować.źródło
Oba mogą dać ci zbliżone wartości na liczbach całkowitych lub co najmniej 10 wartości dziesiętnych. Ale jeśli naprawdę zastanawiasz się nad długimi zmiennymi wartościami, obie mogą być różne. Podejście może się różnić w zależności od tego, co chcesz osiągnąć.
Wartości zmiennoprzecinkowe
@Andrew Clark miał rację w swoim zeznaniu.
źródło
Przypuszczam, że
x = [[-5.01,-5.43,1.08,0.86,-2.67,4.94,-2.51,-2.25,5.56,1.03], [-8.12,-3.48,-5.52,-3.78,0.63,3.29,2.09,-2.13,2.86,-3.33], [-3.68,-3.54,1.66,-4.11,7.39,2.08,-2.59,-6.94,-2.26,4.33]]
możesz zauważyć, że
x
ma wymiar 3 * 10, jeśli potrzebujesz dostać sięmean
do każdego wiersza, możesz to wpisaćnie zapomnij
import numpy as np
źródło
źródło
Znajdź średnią na liście za pomocą następującego kodu PYTHON :
spróbuj tego łatwo.
źródło
lub jak opublikowano wcześniej
1.0 ma zapewnić podział zmiennoprzecinkowy
źródło
Łącząc kilka powyższych odpowiedzi, wymyśliłem następujące, które działają z redukcją i nie zakładają, że masz
L
dostęp do funkcji redukcji:źródło
Chcę dodać tylko inne podejście
źródło
źródło