我想从用户那里接收输入,解析它,然后对结果表达式执行一些替换。我知道我可以使用sympy.parsing.sympy_parser.parse_expr
解析来自用户的任意输入。但是,我在函数定义中无法替换。有没有可能以这种方式提供补助,如果有,我怎么做?
总体目标是允许用户提供x
函数,然后使用该函数来拟合数据。parse_expr
可以让我达到95%的速度,但是我想提供一些方便的扩展,如下图所示。
import sympy
from sympy.parsing.sympy_parser import parse_expr
x,height,mean,sigma = sympy.symbols('x height mean sigma')
gaus = height*sympy.exp(-((x-mean)/sigma)**2 / 2)
expr = parse_expr('gaus(100, 5, 0.2) + 5')
print expr.subs('gaus',gaus) # prints 'gaus(100, 5, 0.2) + 5'
print expr.subs(sympy.Symbol('gaus'),gaus) # prints 'gaus(100, 5, 0.2) + 5'
print expr.subs(sympy.Symbol('gaus')(height,mean,sigma),gaus) # prints 'gaus(100, 5, 0.2) + 5'
# Desired output: '100 * exp(-((x-5)/0.2)**2 / 2) + 5'
这是使用Python2.7.9和Sympy0.7.5完成的。
最佳答案
您可以使用replace
方法。例如
gaus = Function("gaus") # gaus is parsed as a Function
expr.replace(gaus, Lambda((height, mean, sigma), height*sympy.exp(-((x-mean)/sigma)**2 / 2)))
replace
还有其他选项,例如模式匹配。