如何将包含erf函数的SymPy表达式用于NumPy
问题描述:
我想用SymPy对包含erf函数的符号表达式进行lambdify。这可以通过如下标量参数完成:如何将包含erf函数的SymPy表达式用于NumPy
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
这是一个错误,还是我失去了一些小事?
答
你告诉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
。
你也可以使用'modules = ['numpy',{'erf':scipy.special.erf}]'来使用scipy'erf'。 – asmeurer 2014-10-01 22:32:27