Python 3.x Sympy-查找某一级别的所有表达式
图中显示了如何使用Python 3.x Sympy-查找某一级别的所有表达式,python-3.x,sympy,Python 3.x,Sympy,图中显示了如何使用srepr(expr)创建包含公式树所有元素的字符串 我希望将此类树的某个级别的所有元素都放在列表中,而不是作为字符串,而是作为sympy对象。 例如 from sympy import * x,y,z = symbols('x y z') expr = sin(x*y)/2 - x**2 + 1/y s(repr) """ gives out => "Add(Mul(Integer(-1), Pow(Symbol('x'), Integer(2))), Mul(Ra
srepr(expr)
创建包含公式树所有元素的字符串
我希望将此类树的某个级别的所有元素都放在列表中,而不是作为字符串,而是作为sympy对象。
例如
from sympy import *
x,y,z = symbols('x y z')
expr = sin(x*y)/2 - x**2 + 1/y
s(repr)
"""
gives out
=> "Add(Mul(Integer(-1), Pow(Symbol('x'), Integer(2))), Mul(Rational(1, 2),
sin(Mul(Symbol('x'), Symbol('y')))), Pow(Symbol('y'), Integer(-1)))"
"""
这将导致
first_level = [sin(x*y)/2,-x**2,1/y]
second_level[0] = [sin(x*y),2]
我假设,最基本的问题是,如何根据表达式树索引一个symphy表达式,以便从任意点开始的所有更高级别在列表元素中求和
对于第一级,可以解决该任务 通过获取第一级的类型(在本例中添加,然后运行)
但是对于树中更深的表达式,它是如何工作的呢?我认为您要查找的是
.args
。例如,您的示例我们有:
来自sympy导入的*
x、 y,z=符号('x y z')
expr=sin(x*y)/2-x**2+1/y
第一级=expr.args
第二级=[e.args表示第一级中的e]
打印(第一级)
打印(第二级[0])
"""
(1/y,sin(x*y)/2,-x**2)
(y,-1)
"""
它们给出了元组,但我相信您可以将它们转换为列表
如果要直接进入树的底部,请使用.atoms()
,它将生成一组:
print(expr.atoms())
"""
{x,2,y,-1,1/2}
"""
另一件有趣的事情是perorder\u traversal()
,它似乎给出了一个树型对象,如果你遍历它,你会得到类似幂集的东西:
print([e代表预订单中的e\u遍历(expr)])
"""
[-x**2+sin(x*y)/2+1/y,1/y,y,-1,sin(x*y)/2,1/2,sin(x*y),x*y,x,y,-x**2,-1,x**2,x,x,2]
"""
以下是函数的docstring的开头:
对树进行预排序遍历
该迭代器递归地生成它以预排序方式访问过的节点。也就是说,它首先生成当前节点,然后沿树的宽度下降,以生成节点的所有子节点的预序遍历
对于表达式,遍历的顺序取决于.args的顺序,在许多情况下可以是任意的
如果这些都不是你想要的,那么我可能无法正确理解你的问题。对此表示歉意。谢谢,这似乎详细回答了问题。
print(list(Add.make_args(expr)))