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


191

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?


20
In realtà, la documentazione non lo chiarisce immediatamente, per quanto posso vedere. Non dire che è impossibile dirlo, ma penso che questa domanda sia valida per Stack Overflow lo stesso.
BlackVegetable,

1
numpy.mean: restituisce la media degli elementi dell'array.
Joaquin,

@joaquin: "Calcola la media aritmetica lungo l'asse specificato." vs "Calcola la media ponderata lungo l'asse specificato."?
Blender

@Blender giusto. Stavo solo cercando di dare una sorta di risposta divertente al tuo commento perché se seguo le tue istruzioni la prima cosa che leggo nei documenti per numpy.mean è numpy.mean: restituisce la media degli elementi dell'array che è divertente se lo sei cercando la risposta alla domanda del PO.
Joaquin,

Risposte:


181

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
...

60
Perché offrono due diverse funzioni? Sembra che dovrebbero semplicemente offrire np.averagepoiché weightsè già facoltativo. Sembra inutile e serve solo a confondere gli utenti.
Geoff,

6
@Geoff Preferirei che lanciassero NotImplementedException per "medio", per educare gli utenti che la media aritmetica non è identica a "media".
FooBar,

27

np.mean calcola sempre una media aritmetica e ha alcune opzioni aggiuntive per input e output (ad es. quali tipi di dati usare, dove posizionare il risultato).

np.averagepuò calcolare una media ponderata se weightsviene fornito il parametro.


25

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

1
Nota: np.ma.averagefunziona. Inoltre, c'è una segnalazione di bug .
Neil G

2

Nella tua chiamata, le due funzioni sono uguali.

average può calcolare comunque una media ponderata.

Collegamenti doc: meaneaverage


0

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).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.