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?
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?
Odpowiedzi:
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
...
np.average
ponieważ weights
jest już opcjonalny. Wydaje się niepotrzebny i służy jedynie do dezorientacji użytkowników.
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
W twoim wywołaniu dwie funkcje są takie same.
average
może jednak obliczyć średnią ważoną.
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.average
nie zezwala na dtype
sł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 h5
pliku. 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.average
uż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.sum
albo np.mean
odpowiednio (z odpowiednią dokładnością).