我知道我可以通过覆盖print_tree
Sympy函数来解析Sympy表达式作为树,该函数可以很好地遍历表达式。
但是,是否可以修改表达式中的特定术语?
以下是我想要修改表达式的两个示例。
1)示例1
说,我有以下表达式,
ineq = x**2 > x + 2
如何仅在RHS中修改'x',以便它变为,例如
ineq = x**2 > z**2 + 2
使用subs
或replace
函数将替换所有出现的内容。但我正在寻找一种方法来替换函数的一个特定事件。
2)示例2
是否可以更改平等/不平等标志?
例如,我可以在表达式中将>
更改为<
,还是将>
更改为=
?
例如,如果我有表达式
x**2 > z**2 + 2
我想将其改为,
x**2 == z**2 + 2
谢谢!
答案 0 :(得分:1)
示例1
使用 x ** 2
的临时替代品In [1]: ineq = x**2 > x + 2
In [3]: ineq.subs(x**2, t).subs(x, z**2).subs(t, x**2)
Out[3]:
2 2
x > z + 2
嵌套多个 .subs()而不是一次替换会强制替换一次发生一次。
示例2
将参数传递给其他关系的对象构造函数:
In [5]: Eq(*ineq.args)
Out[5]:
2
x = x + 2
In [6]: StrictLessThan(*ineq.args)
Out[6]:
2
x < x + 2
In [7]: LessThan(*ineq.args)
Out[7]:
2
x ≤ x + 2
答案 1 :(得分:1)
首先,请注意SymPy表达式是不可变的,因此您无法在适当的位置修改它们(您编写的任何函数都将返回一个新表达式)。
你总是可以通过挖掘.args
来任意操纵一个表达式。如果你有一个你想要操作的特定表达式,这通常比试图聪明或尝试编写更通用的函数来进行操作更容易。例如
In [27]: ineq = x**2 > x + 2
In [28]: ineq.args
Out[28]:
⎛ 2 ⎞
⎝x , x + 2⎠
In [29]: ineq.args[0] > ineq.args[1].subs(x, z**2)
Out[29]:
2 2
x > z + 2
有关详细信息,请参阅http://docs.sympy.org/latest/tutorial/manipulation.html。