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?
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?
Réponses:
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
...
np.average
car weights
c'est déjà facultatif. Cela semble inutile et ne sert qu'à confondre les utilisateurs.
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
np.ma.average
fonctionne. En outre, il existe un rapport de bogue .
Dans votre appel, les deux fonctions sont identiques.
average
peut cependant calculer une moyenne pondérée.
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.average
n'autorise pas le dtype
mot - 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 h5
fichier. 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.average
plus 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).