2014-09-30 66 views
2

我想用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 

這是一個錯誤,還是我失去了一些小事?

回答

1

你告訴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.Floatfloat

+1

你也可以使用'modules = ['numpy',{'erf':scipy.special.erf}]'來使用scipy'erf'。 – asmeurer 2014-10-01 22:32:27