【问题标题】:sympy: modifying an expression manuallysympy:手动修改表达式
【发布时间】:2016-02-23 01:16:54
【问题描述】:

我知道我可以通过覆盖很好地遍历表达式的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

谢谢!

【问题讨论】:

    标签: python regex sympy


    【解决方案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
    

    【讨论】:

      【解决方案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。

      【讨论】:

        猜你喜欢
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-14
        相关资源
        最近更新 更多