在arange上使用数学函数

时间:2013-11-13 20:05:29

标签: python math python-2.7 numpy

我有一个我想要应用于arange的函数:

import math
from numpy import arange
x = arange(7.0,39.0,0.0001)
fx = math.exp(-2.0 / (-14.4 + 19.33 * x - 0.057 * pow(x,2)))

产生的错误如下:

`TypeError: only length-1 arrays can be converted to Python scalars`

我正在使用Python 2.7。

这种pythonic方法似乎应该可行,但事实并非如此。根据等式,我需要做些什么才能使fx包含相应的f(x)值?

感谢。

2 个答案:

答案 0 :(得分:6)

使用Numpy的exp代替math

>>> from numpy import arange, exp
>>> x = arange(7.0,39.0,0.0001)
>>> fx = exp(-2.0 / (-14.4 + 19.33 * x - 0.057 * pow(x,2)))
>>> fx
array([ 0.98321018,  0.98321044,  0.98321071, ...,  0.99694082,
        0.99694082,  0.99694083])

Numpy的版本与Numpy ndarrays(如x)相得益彰。它还具有Numpy的性能优势,在这种情况下,与vectorize math.exp解决方案相比,它具有一个数量级:

# built-in Numpy function
In [5]: timeit exp(-2.0 / (-14.4 + 19.33 * x - 0.057 * pow(x,2)))
100 loops, best of 3: 10.1 ms per loop
# vectorized math.exp function
In [6]: fx = np.vectorize(lambda y: math.exp(-2.0 / (-14.4 + 19.33 *  - 0.057 * pow(y,2))))
In [7]: timeit fx(x)
1 loops, best of 3: 221 ms per loop

答案 1 :(得分:4)

一般情况下,你必须vectorize你的函数适用于np.array:

>>> import numpy as np
>>> x = arange(7.0,39.0,0.0001)
>>> fx = np.vectorize(lambda y: math.exp(-2.0 / (-14.4 + 19.33 * y  - 0.057 * pow(y,2))))
>>> fx(x)
array([ 0.98321018,  0.98321044,  0.98321071, ...,  0.99694082,
        0.99694082,  0.99694083])

或者,正如提到的@ mtitan8,使用numpy的矢量化模拟。

正如@abarnert正确指出的那样,如果你应该尽可能地努力争取numpy等价物,因为它将胜过手工矢量化的功能。