Solución:
los math.exp
funciona solo para escalares como menciona EdChum. Mientras que numpy.exp
funcionará para matrices.
Ejemplo:
>>> 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 ])
>>>
Es el mismo caso para otros math
funciones.
>>> 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])
>>>
Consulte también ESTA RESPUESTA para ver cómo numpy
es más rápido que math
.
math.exp
funciona en un solo número, la versión numpy funciona en matrices numpy y es tremendamente más rápida debido a los beneficios de la vectorización. los exp
la función no está sola en esto – varios math
funciones tienen numerosas contrapartes, como sin
, pow
etc.
Considera lo siguiente:
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 versión numpy es ~ 9 veces más rápida (y probablemente se pueda hacer más rápida aún mediante una elección cuidadosa de bibliotecas matemáticas optimizadas)
Como indica @camz a continuación, el math
La versión será más rápida cuando se trabaja con valores únicos (en una prueba rápida, ~ 7.5 veces más rápido).