exp
означает экспоненциальную функцию
exp
в math module
: https://docs.python.org/2/library/math.html
exp
в numpy module
: http://docs.scipy.org/doc/numpy/reference/generated/numpy.exp.html
Почему создатели numpy
снова вводят эту функцию?
exp
означает экспоненциальную функцию
exp
в math module
: https://docs.python.org/2/library/math.html
exp
в numpy module
: http://docs.scipy.org/doc/numpy/reference/generated/numpy.exp.html
Почему создатели numpy
снова вводят эту функцию?
math.exp
работает только для скаляров, поскольку EdChum упоминает. В то время как numpy.exp
будет работать для массивов.
Пример:
>>> 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 ])
>>>
Это тот же случай для других функций 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])
>>>
Также см. ЭТО ОТВЕТ, чтобы узнать, как numpy
работает быстрее, чем math
.
math.exp
работает с одним номером, версия numpy работает на массивах numpy и значительно быстрее благодаря преимуществам векторизации. Функция exp
не единственная в этом - несколько функций math
имеют numpy-копии, такие как sin
, pow
и т.д.
Рассмотрим следующее:
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
Версия numpy ~ ~ 9 раз быстрее (и, возможно, еще быстрее достигается тщательный выбор оптимизированных математических библиотек)
В качестве состояний @camz ниже - версия math
будет быстрее при работе с одиночными значениями (в быстром тесте, ~ 7.5x быстрее).
Если вы вручную векторизуете math.exp, используя map, это быстрее, чем numpy. Насколько я проверял..
% timeit np.exp (обр)
500 мкс ± 3,37 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, 1000 циклов в каждом)
% timeit map (math.exp, arr)
148 нс ± 4 нс на цикл (среднее ± стандартное отклонение из 7 циклов, 10000000 циклов в каждом)