L'ho notato
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
Tuttavia, ci dovrebbero essere alcune differenze, dal momento che dopo tutto sono due funzioni diverse.
Quali sono le differenze tra loro?
L'ho notato
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
Tuttavia, ci dovrebbero essere alcune differenze, dal momento che dopo tutto sono due funzioni diverse.
Quali sono le differenze tra loro?
Risposte:
np.average accetta un parametro di peso opzionale. Se non viene fornito sono equivalenti. Dai un'occhiata al codice sorgente: Media , Media
np.mean:
try:
mean = a.mean
except AttributeError:
return _wrapit(a, 'mean', axis, dtype, out)
return mean(axis, dtype, out)
np.average:
...
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
poiché weights
è già facoltativo. Sembra inutile e serve solo a confondere gli utenti.
In alcune versioni di numpy c'è un'altra differenza importante che devi conoscere:
average
non prendere in considerazione le maschere, quindi calcola la media sull'intero set di dati.
mean
tiene conto delle maschere di account, quindi calcola la media solo su valori non mascherati.
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
np.ma.average
funziona. Inoltre, c'è una segnalazione di bug .
Nella tua chiamata, le due funzioni sono uguali.
average
può calcolare comunque una media ponderata.
Oltre alle differenze già note, c'è un'altra differenza estremamente importante che ho appena scoperto nel modo più duro: a differenza np.mean
, np.average
non consente la dtype
parola chiave, che è essenziale per ottenere risultati corretti in alcuni casi. Ho un array a precisione singola molto grande a cui si accede da un h5
file. Se prendo la media lungo gli assi 0 e 1, ottengo risultati selvaggiamente errati a meno che non specifichi 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
Sfortunatamente, a meno che tu non sappia cosa cercare, non puoi necessariamente dire che i tuoi risultati sono sbagliati. Non userò mai np.average
più per questo motivo, ma userò sempre np.mean(.., dtype='float64')
su qualsiasi array di grandi dimensioni. Se voglio una media ponderata, la calcolerò esplicitamente usando il prodotto del vettore di peso e l'array di destinazione e quindi uno np.sum
o np.mean
, come appropriato (anche con precisione adeguata).