sympy:手动修改表达式

时间:2016-02-23 01:16:55

标签: python regex 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

谢谢!

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