1

我有一个要应用于范围的函数:

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) 值?

谢谢。

4

2 回答 2

6

使用 Numpyexp代替math's:

>>> 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
于 2013-11-13T20:07:59.180 回答
4

在一般情况下,您必须对函数进行矢量化以适用于 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 等效项,因为它将优于手动矢量化的函数。

于 2013-11-13T20:10:06.770 回答