繁体   English   中英

如何在sympy中评估表达式树?

[英]How to evaluate an expression-tree in sympy?

这可能是一个非常基本的问题,但是我想知道在阅读完文档后是否缺少了sympy功能,或者此用例是否真的不包含此功能。

我有以下表达式:

a = sympify("b + 5")
b = sympify("c + 5")
c = sympify("5")

我正在尝试评估。 sympy是否可以通过某种方式为您进行所有递归搜索和替换,或者我真的必须手动进行?

如:

eval(str(eval(str(a))))

区分符号和表达式:

import sympy as sy
a, b, c = sy.symbols('a:c')

a_expr = sy.sympify("b + 5")
b_expr = sy.sympify("c + 5")
c_expr = sy.sympify("5")

sy.solve([sy.Eq(a,a_expr), sy.Eq(b,b_expr), sy.Eq(c,c_expr)])

产量

{c: 5, b: 10, a: 15}

在上面, a是一个符号,但是a_expr是一个表达式:

In [117]: type(a)
Out[117]: sympy.core.symbol.Symbol

In [118]: type(a_expr)
Out[118]: sympy.core.add.Add

给定一个公式如

formulas = {'a': 'b+5', 'b': 'c+5', 'c': '5'}

您可以通过列表理解来形成方程式

equations = [sy.Eq(sy.symbols(variable), sy.sympify(expr))
             for variable, expr in formulas.items()]

并用

solution = sy.solve(equations)
# {c: 5, b: 10, a: 15}

为什么不应该使用sympy.var

当处理动态变量时,直到运行时其名称都是未知的变量,建议避免使用sy.var sy.var将变量的名称添加到全局名称空间。 这样做的唯一目的是如果您要通过name引用变量 但是通过假设,变量名称在运行时才是未知的。 因此,脚本代码不应该(实际上应该不应该)按名称引用变量。 因此,如果变量确实是动态的,则使用sy.var应该无用。

但这不是真正的问题。 动态变量名称(作为字符串)可以用

In [22]: formulas.keys()
Out[22]: ['a', 'c', 'b']

sy.Symbols可以用

In [23]: solution.keys()
Out[23]: [c, b, a]

因此,您可以编写循环来访问每个变量,而不必为每个Symbol定义全局变量名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM