Подтвердить что ты не робот

Python: В чем разница между math.exp и numpy.exp и почему создатели numpy предпочитают вводить exp снова

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 снова вводят эту функцию?

4b9b3361

Ответ 1

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.

Ответ 2

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 быстрее).

Ответ 3

Если вы вручную векторизуете math.exp, используя map, это быстрее, чем numpy. Насколько я проверял..

% timeit np.exp (обр)

500 мкс ± 3,37 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, 1000 циклов в каждом)

% timeit map (math.exp, arr)

148 нс ± 4 нс на цикл (среднее ± стандартное отклонение из 7 циклов, 10000000 циклов в каждом)