在sympy中运行表达式的AST

吉姆

我正在使用sympy计算复杂函数表达式的一些高阶导数。我想遍历表达式的AST,例如首先遍历节点深度。我怎么做 ?

约翰·C

一个简单的深度优先旅行是这样的:

from sympy import pi, sin
from sympy.abc import a,x,y

def depth_first_traverse(expr):
    for arg in expr.args:
        depth_first_traverse(arg, depth+1, new_marks+'+---', parent_ind=ind)
    if len(expr.args) == 0:
        # we reached a leaf of the tree
        pass  # do something with leaf expr
    else:
        pass  # do something with compound expr
depth_first_traverse(sin(a*x*pi+1.5)/y)

使用其他参数,可以达到更复杂的目标,例如以深度优先的顺序打印树,同时显示所有内容如何组合在一起:

from sympy import srepr, pi, sin
from sympy.abc import a,x,y

def depth_first_traverse(expr, depth=0, marks='', parent_ind=None):
    for ind, arg in enumerate(expr.args):
        new_marks = marks.replace('+', '|').replace('-', ' ')
        if parent_ind == 0:
            new_marks = new_marks[:-4] + ' ' + new_marks[-3:]
        depth_first_traverse(arg, depth+1, new_marks+'+---', parent_ind=ind)
    if len(expr.args) == 0:
        print(marks, end="> ")
        print("symbol", srepr(expr))
    else:
        print(marks, end="+ ")
        print("function", expr.func, "had", len(expr.args), "arguments")

    print(marks.replace('+', '|').replace('-', ' '))

depth_first_traverse(sin(a*x*pi+1.5)/y)

输出:

    +---> symbol Symbol('y')
    |   
    +---> symbol Integer(-1)
    |   
+---+ function <class 'sympy.core.power.Pow'> had 2 arguments
|   
|       +---> symbol Float('1.5', precision=53)
|       |   
|       |   +---> symbol pi
|       |   |   
|       |   +---> symbol Symbol('a')
|       |   |   
|       |   +---> symbol Symbol('x')
|       |   |   
|       +---+ function <class 'sympy.core.mul.Mul'> had 3 arguments
|       |   
|   +---+ function <class 'sympy.core.add.Add'> had 2 arguments
|   |   
+---+ function sin had 1 arguments
|   
+ function <class 'sympy.core.mul.Mul'> had 2 arguments

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

让表达式在AST中如何工作?

来自分类Dev

在sympy中智能重写表达式

来自分类Dev

解决 sympy 中的表达式列表

来自分类Dev

如何获得sympy表达式中的符号列表?

来自分类Dev

Sympy:逻辑表达式中的C代码

来自分类Dev

odeint()中的Sympy表达式给出了派生错误

来自分类Dev

在Sympy中收集类似表达式的术语

来自分类Dev

在sympy中,使用规范的换向关系简化表达式

来自分类Dev

如何在sympy中替换和简化表达式?

来自分类Dev

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

来自分类Dev

如何获取SymPy表达式中的符号数

来自分类Dev

计算Sympy中的三角表达式

来自分类Dev

如何在sympy中显示完整的表达式?

来自分类Dev

Sympy:替换表达式中的“ -1”吗?

来自分类Dev

sympy中表达式的数值

来自分类Dev

Sympy:从表达式获取函数

来自分类Dev

从sympy表达式生成python代码?

来自分类Dev

Sympy-比较表达式

来自分类Dev

获取sympy表达式的操作

来自分类Dev

从SymPy表达式中提取数字

来自分类Dev

sympy中表达式的数值

来自分类Dev

单变量表达式上sympy中的evalf和subs返回表达式,而不是预期的浮点值

来自分类Dev

用AST python中的表达式中的实际值替换变量名称

来自分类Dev

用AST python中的表达式中的实际值替换变量名称

来自分类Dev

Python Sympy任意近似到任意Sympy表达式?

来自分类Dev

如何在Safari中运行正则表达式

来自分类Dev

无法在Java中运行Lambda表达式

来自分类Dev

AST中的表达式大小对于成员访问不正确

来自分类Dev

如何在python3中使用AST递归简化数学表达式?