sympy:手动修改表达式



我知道我可以通过覆盖可以很好地遍历表达式的print_tree Sympy函数将Sympy表达式解析为树。

但是,是否可以修改表达式中的特定术语?

以下是我想要如何修改表达式的两个示例。

1) 示例 1

说,我有以下表达,

ineq = x**2 > x + 2

我如何仅在 RHS 中修改"x",以便它变成,例如,

ineq = x**2 > z**2 + 2

使用 subsreplace 函数将替换所有匹配项。但我正在寻找一种方法来替换函数的一个特定出现。

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。

最新更新