web-dev-qa-db-fra.com

Python: Quelle est la différence entre math.exp et numpy.exp et pourquoi les créateurs numpy ont-ils choisi de réintroduire exp

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?

20
kyle

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

26
ThePredator

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

7
Chinmay Kanchi

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

0
Z Che