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.averagepoiché 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.averagefunziona. 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.averagenon consente la dtypeparola chiave, che è essenziale per ottenere risultati corretti in alcuni casi. Ho un array a precisione singola molto grande a cui si accede da un h5file. 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.averagepiù 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.sumo np.mean, come appropriato (anche con precisione adeguata).