我有一个我想要应用于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)值?
感谢。
答案 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等价物,因为它将胜过手工矢量化的功能。