[PYTHON] confrontation de vitesse np.mean et np.average

Il existe deux façons de calculer la moyenne avec NumPy: np.mean et np.average (bien qu'il puisse y en avoir d'autres). Ici, laissons la différence entre les deux à d'autres articles, et voyons ce qui est le meilleur en termes de vitesse de traitement. Le code suivant faisait référence à ce site.

Environnement d'exécution

CentOS Linux release 7.6.1810 (Core) Python 3.8.5

Code d'exécution 1

Tout d'abord, faites simplement la moyenne du tableau unidimensionnel.

test1.py


import timeit
import numpy as np

def func_average(n):
    return np.average(np.arange(n**2))

def func_mean(n):
    return np.mean(np.arange(n**2))

n = 1000
loop = 1000

result_average = timeit.timeit(lambda: func_average(n), number=loop)
result_mean = timeit.timeit(lambda: func_mean(n), number=loop)

print('average: ', result_average / loop)
print('mean:    ', result_mean / loop)

Résultat d'exécution

average:  0.0015093836802989244
mean:     0.001964871450792998

En plus de cela, j'ai mesuré 4 fois, mais dans chaque cas, «np.average» était environ 20 à 30% plus rapide.

Code d'exécution 2

Ensuite, prenez la moyenne du tableau à deux dimensions.

test.py


import timeit
import numpy as np

def func_average(n):
    return np.average(np.arange(n**2).reshape(n, n))

def func_mean(n):
    return np.mean(np.arange(n**2).reshape(n, n))

n = 1000
loop = 1000

result_average = timeit.timeit(lambda: func_average(n), number=loop)
result_mean = timeit.timeit(lambda: func_mean(n), number=loop)

print('average: ', result_average / loop)
print('mean:    ', result_mean / loop)

Résultat d'exécution

average:  0.0016613604403100909
mean:     0.002270303561817855

Même dans ce cas, «np.average» était rapide.

Considération

J'ai essayé d'autres conditions similaires, mais le résultat était que «np.average» était plus rapide. Cela ne veut pas dire np.mean ... Je pensais que ce n'était pas le cas, et quand j'ai cherché plus loin, j'ai trouvé un tel fil. Traduit, modifié et cité ci-dessous:

(Omis) Il y a d'autres différences à considérer entre «moyenne» et «moyenne» (d'autres différences ont été mentionnées dans le fil précédent). «average» prend la moyenne de toutes les valeurs du tableau sans tenir compte du masque, tandis que «mean» prend le masque, donc il prend la moyenne uniquement avec 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

En effet, il semble que «mean» devrait être utilisé lorsqu'il s'agit de tableaux contenant des valeurs manquantes.

Conclusion

Il est préférable de l'utiliser correctement en fonction de l'objectif, mais compte tenu du temps nécessaire pour l'ensemble du programme, je pense que le rapport entre «moyenne» et «moyenne» est insignifiant, donc l'option d'utiliser «moyenne» sans penser à rien N'est-ce pas une fourmi?

Recommended Posts

confrontation de vitesse np.mean et np.average
Comparaison de vitesse entre CPython et PyPy