如何对包含erf函数的SymPy表达式进行lambdify以与NumPy一起使用

时间:2014-09-30 18:15:20

标签: python numpy sympy

我想使用SymPy对包含erf函数的符号表达式进行lambd化。这可以用于标量参数,如下所示:

log_normal = 0.5 + 0.5 * sym.erf((sym.log(x) - mu) / sym.sqrt(2 * sigma**2))
F = sym.lambdify([x, mu, sigma], log_normal)
F(1.0, 0.0, 1.0)

我想对上述内容进行矢量化。通常我会这样做......

log_normal = 0.5 + 0.5 * sym.erf((sym.log(x) - mu) / sym.sqrt(2 * sigma**2))
vector_F = sym.lambdify([x, mu, sigma], log_normal, modules='numpy')
vector_F(1.0, 0.0, 1.0)

然而,上面提出了NameError ...

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-29-14adde48d4a1> in <module>()
----> 1 vector_F(1.0, 0.0, 1.0)

/Users/drpugh/anaconda/lib/python2.7/site-packages/numpy/__init__.pyc in <lambda>(x, mu,     sigma)

NameError: global name 'erf' is not defined

这是一个错误,还是我错过了一些微不足道的东西?

2 个答案:

答案 0 :(得分:3)

你告诉lambdify它只有numpy作为一个模块玩;给它erf的来源。我,你有

>>> vector_F = sym.lambdify([x, mu, sigma], log_normal, modules=['numpy'])
>>> vector_F(1.0, 0.0, 1.0)
Traceback (most recent call last):
  File "<ipython-input-10-14adde48d4a1>", line 1, in <module>
    vector_F(1.0, 0.0, 1.0)
  File "<string>", line 1, in <lambda>
NameError: global name 'erf' is not defined

>>> vector_F = sym.lambdify([x, mu, sigma], log_normal, modules=['numpy', 'sympy'])
>>> vector_F(1.0, 0.0, 1.0)
0.500000000000000

>>> vector_F = sym.lambdify([x, mu, sigma], log_normal, modules=['numpy', 'math'])
>>> vector_F(1.0, 0.0, 1.0)
0.5

或您喜欢的erf,具体取决于您是想要sympy.core.numbers.Float还是float

答案 1 :(得分:1)

从SymPy 1.3开始,lambdify中自动支持scipy。如果省略modules参数,它将自动添加scipy。或者,您可以使用modules=['numpy', 'scipy']

>>> log_normal = 0.5 + 0.5 * sym.erf((sym.log(x) - mu) / sym.sqrt(2 * sigma**2))
>>> vector_F = sym.lambdify([x, mu, sigma], log_normal)
>>> vector_F(1.0, 0.0, 1.0)
0.5

通常,要支持lambdify不知道的功能,请将其作为字典添加到modules参数中。 modules参数确定运行lambdified函数的名称空间。请参见lambdify documentation。例如,要在SymPy <1.3中支持erf:

>>> import scipy.special
>>> vector_F = sym.lambdify([x, mu, sigma], log_normal, modules=['numpy', {'erf': scipy.special.erf}])
>>> vector_F(1.0, 0.0, 1.0)
0.5