我知道我可以通过覆盖可以很好地遍历表达式的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
谢谢!
示例 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
首先,请注意,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。