np.mean () vs np.average () w Python NumPy?

191

zauważam to

In [30]: np.mean([1, 2, 3])
Out[30]: 2.0

In [31]: np.average([1, 2, 3])
Out[31]: 2.0

Jednak powinny być pewne różnice, ponieważ w końcu są to dwie różne funkcje.

Jakie są między nimi różnice?

Hazard Sibbs
źródło
20
W rzeczywistości, o ile widzę, dokumentacja nie wyjaśnia tego od razu. Nie mówię, że nie można tego powiedzieć, ale myślę, że to pytanie jest ważne dla przepełnienia stosu.
BlackVegetable,
1
numpy.mean: Zwraca średnią z elementów tablicy.
joaquin
@joaquin: „Oblicz średnią arytmetyczną wzdłuż określonej osi.” vs „Oblicz średnią ważoną wzdłuż określonej osi.”?
Blender
@ Blender prawo. Właśnie próbowałem udzielić pewnego rodzaju śmiesznej odpowiedzi na twój komentarz, ponieważ jeśli zastosuję się do twoich instrukcji, pierwszą rzeczą, którą przeczytałem w dokumentacji dla numpy.mean jest numpy.mean: Zwraca średnią z elementów tablicy, co jest śmieszne, jeśli jesteś szukam odpowiedzi na pytanie PO.
joaquin

Odpowiedzi:

181

np. średnia przyjmuje opcjonalny parametr wagi. Jeśli nie jest dostarczony, są równoważne. Spójrz na kod źródłowy: Mean , Average

np.mean:

try:
    mean = a.mean
except AttributeError:
    return _wrapit(a, 'mean', axis, dtype, out)
return mean(axis, dtype, out)

np. średnia:

...
if weights is None :
    avg = a.mean(axis)
    scl = avg.dtype.type(a.size/avg.size)
else:
    #code that does weighted mean here

if returned: #returned is another optional argument
    scl = np.multiply(avg, 0) + scl
    return avg, scl
else:
    return avg
...
Młotek
źródło
60
Dlaczego oferują dwie różne funkcje? Wydaje się, że powinni po prostu zaoferować, np.averageponieważ weightsjest już opcjonalny. Wydaje się niepotrzebny i służy jedynie do dezorientacji użytkowników.
Geoff
6
@Geoff Wolę, aby rzucili NotImplementedException dla „średniej”, aby uświadomić użytkownikom, że średnia arytmetyczna nie jest identyczna z „średnią”.
FooBar
27

np.mean zawsze oblicza średnią arytmetyczną i ma kilka dodatkowych opcji wejścia i wyjścia (np. jakich typów danych użyć, gdzie umieścić wynik).

np.averagemoże obliczyć średnią ważoną, jeśli weightsparametr jest podany.

Bursztyn
źródło
25

W niektórych wersjach numpy istnieje inna ważna różnica, o której musisz wiedzieć:

average nie bierz pod uwagę masek, więc oblicz średnią z całego zestawu danych.

mean bierze pod uwagę maski kont, więc obliczaj średnią tylko dla niezamaskowanych wartości.

g = [1,2,3,55,66,77]
f = np.ma.masked_greater(g,5)

np.average(f)
Out: 34.0

np.mean(f)
Out: 2.0
GM
źródło
1
Uwaga: np.ma.averagedziała. Istnieje również raport o błędzie .
Neil G
2

W twoim wywołaniu dwie funkcje są takie same.

average może jednak obliczyć średnią ważoną.

Łącza do dokumentów: meaniaverage

Prashant Kumar
źródło
0

Oprócz wspomnianych różnic, istnieje jeszcze jedna niezwykle ważna różnica, którą właśnie odkryłem na własnej skórze: w przeciwieństwie do np.mean, np.averagenie zezwala na dtypesłowo kluczowe, które jest niezbędne do uzyskania poprawnych wyników w niektórych przypadkach. Mam bardzo dużą tablicę o pojedynczej precyzji, do której można uzyskać dostęp z h5pliku. Jeśli wezmę średnią wzdłuż osi 0 i 1, otrzymam bardzo niepoprawne wyniki, chyba że podam dtype='float64':

>T.shape
(4096, 4096, 720)
>T.dtype
dtype('<f4')

m1 = np.average(T, axis=(0,1))                #  garbage
m2 = np.mean(T, axis=(0,1))                   #  the same garbage
m3 = np.mean(T, axis=(0,1), dtype='float64')  # correct results

Niestety, chyba że wiesz, czego szukać, niekoniecznie musisz powiedzieć, że wyniki są złe. Nigdy więcej nie np.averageużyję z tego powodu, ale zawsze użyję np.mean(.., dtype='float64')na dowolnej dużej tablicy. Jeśli chcę średnią ważoną, obliczę ją jawnie, używając iloczynu wektora wagi i tablicy docelowej, a następnie albo, np.sumalbo np.meanodpowiednio (z odpowiednią dokładnością).

Grant Petty
źródło