exp
signifie fonction exponentielle
exp
in math module
: https://docs.python.org/2/library/math.html
exp
in numpy module
: http://docs.scipy.org/doc/numpy/reference/generated/numpy.exp.html
Pourquoi les créateurs de numpy
introduisent-ils cette fonction à nouveau?
Le math.exp
ne fonctionne que pour les scalaires sous la forme EdChum mentions. Alors que numpy.exp
fonctionnera pour les tableaux.
Exemple:
>>> import math
>>> import numpy as np
>>> x = [1.,2.,3.,4.,5.]
>>> math.exp(x)
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
math.exp(x)
TypeError: a float is required
>>> np.exp(x)
array([ 2.71828183, 7.3890561 , 20.08553692, 54.59815003,
148.4131591 ])
>>>
Il en va de même pour les autres fonctions math
.
>>> math.sin(x)
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
math.sin(x)
TypeError: a float is required
>>> np.sin(x)
array([ 0.84147098, 0.90929743, 0.14112001, -0.7568025 , -0.95892427])
>>>
Référez-vous également à CETTE RÉPONSE pour vérifier comment numpy
est plus rapide que math
.
math.exp
fonctionne sur un seul numéro, la version numpy fonctionne sur des tableaux numpy et est extrêmement rapide en raison des avantages de la vectorisation. La fonction exp
n'est pas la seule dans ce domaine. Plusieurs fonctions math
ont des équivalents numpy, tels que sin
, pow
, etc.
Considérer ce qui suit:
In [10]: import math
In [11]: import numpy
In [13]: arr = numpy.random.random_integers(0, 500, 100000)
In [14]: %timeit numpy.exp(arr)
100 loops, best of 3: 1.89 ms per loop
In [15]: %timeit [math.exp(i) for i in arr]
100 loops, best of 3: 17.9 ms per loop
La version numpy est environ 9 fois plus rapide (et peut probablement être rendue encore plus rapide par un choix judicieux de bibliothèques mathématiques optimisées)
Comme @camz l'indique ci-dessous - la version math
sera plus rapide si vous travaillez sur des valeurs uniques (lors d'un test rapide, environ 7,5 fois plus rapide).
Si vous vectorisez manuellement math.exp en utilisant map, il est plus rapide que numpy. Aussi loin que j'ai testé ..
% timeit np.exp (arr)
500 µs ± 3,37 µs par boucle (moyenne ± écart de développement de 7 cycles, 1000 boucles chacun)
% timeit map (math.exp, arr)
148 ns ± 4 ns par boucle (moyenne ± écart type standard de 7 passages, 10000000 boucles chacun)
Le plus grand centre commercial