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

191

Je remarque que

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

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

Cependant, il devrait y avoir des différences, car après tout, ce sont deux fonctions différentes.

Quelles sont les différences entre eux?

Jeu Sibbs
la source
20
En fait, la documentation ne le rend pas immédiatement clair, pour autant que je puisse le voir. Ne pas dire que c'est impossible à dire, mais je pense que cette question est tout de même valable pour Stack Overflow.
BlackVegetable
1
numpy.mean: renvoie la moyenne des éléments du tableau.
joaquin
@joaquin: "Calculez la moyenne arithmétique le long de l'axe spécifié." vs "Calculez la moyenne pondérée le long de l'axe spécifié."?
Blender
@Blender à droite. J'essayais juste de faire une sorte de réponse amusante à votre commentaire parce que si je suis vos instructions, la première chose que j'ai lue dans la documentation pour numpy.mean est numpy.mean: renvoie la moyenne des éléments du tableau, ce qui est amusant si vous êtes à la recherche de la réponse à la question OP.
joaquin

Réponses:

181

np.average prend un paramètre de poids facultatif. S'il n'est pas fourni, ils sont équivalents. Jetez un œil au code source: Moyenne , Moyenne

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
...
Marteau
la source
60
Pourquoi offrent-ils deux fonctions différentes? Semble qu'ils devraient juste offrir np.averagecar weightsc'est déjà facultatif. Cela semble inutile et ne sert qu'à confondre les utilisateurs.
Geoff
6
@Geoff Je préférerais qu'ils lancent une NotImplementedException pour "moyenne", pour informer les utilisateurs que la moyenne arithmétique n'est pas identique à "la moyenne".
FooBar
27

np.mean calcule toujours une moyenne arithmétique, et a quelques options supplémentaires pour l'entrée et la sortie (par exemple, quels types de données utiliser, où placer le résultat).

np.averagepeut calculer une moyenne pondérée si le weightsparamètre est fourni.

ambre
la source
25

Dans une version de numpy il existe une autre différence importante dont vous devez être conscient:

average ne tenez pas compte des masques, calculez donc la moyenne sur l'ensemble des données.

mean prend en compte les masques, donc calculez la moyenne uniquement sur les valeurs non masquées.

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
la source
1
Remarque: np.ma.averagefonctionne. En outre, il existe un rapport de bogue .
Neil G
2

Dans votre appel, les deux fonctions sont identiques.

average peut cependant calculer une moyenne pondérée.

Liens doc: meanetaverage

Prashant Kumar
la source
0

En plus des différences déjà notées, il y a une autre différence extrêmement importante que je viens de découvrir à la dure: contrairement à np.mean, np.averagen'autorise pas le dtypemot - clé, ce qui est essentiel pour obtenir des résultats corrects dans certains cas. J'ai un très grand tableau simple précision auquel on accède à partir d'un h5fichier. Si je prends la moyenne le long des axes 0 et 1, j'obtiens des résultats complètement incorrects sauf si je spécifie 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

Malheureusement, à moins que vous ne sachiez quoi rechercher, vous ne pouvez pas nécessairement dire que vos résultats sont erronés. Je ne l'utiliserai np.averageplus jamais pour cette raison mais je l'utiliserai toujours np.mean(.., dtype='float64')sur n'importe quel grand tableau. Si je veux une moyenne pondérée, je la calculerai explicitement en utilisant le produit du vecteur de poids et du tableau cible, puis soitnp.sum ou np.mean, selon le cas (avec une précision appropriée également).

Grant Petty
la source