我想从用户那里接收输入,解析它,然后对结果表达式执行一些替换。我知道我可以使用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还有其他选项,例如模式匹配。

10-06 06:14