math.exp和numpy.exp的区别是什么,为什么numpy的创建者选择再次引入exp?

umuewwlo  于 2023-03-08  发布在  其他
关注(0)|答案(3)|浏览(202)

exp的意思是指数函数,为什么numpy创作者又引入了这个函数呢?

q35jwt9p

q35jwt9p1#

math.exp只适用于标量,而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])

另请参考this answer,了解numpy如何比math更快。

wmvff8tz

wmvff8tz2#

math.exp处理单个数字,numpy处理numpy数组,由于矢量化的好处,速度快得惊人。exp函数并不是唯一的一个--一些math函数有numpy对应函数,如sinpow等。
请考虑以下几点:

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.5倍)。

ukxgm1gy

ukxgm1gy3#

如果你使用Map手动矢量化Math.exp,它比Numpy快。据我测试。
%时间它NP.exp(arr)
500 µs ± 3.37 µs/循环(7次运行的平均值±标准差,每次运行1000个循环)
%时间Map(数学表达式,arr)
148 ns ± 4 ns/循环(7次运行的平均值±标准差,每次运行10000000次循环)

相关问题