python 停止sympy对表达式求值

ltskdhd1  于 2023-08-02  发布在  Python
关注(0)|答案(1)|浏览(108)

我希望sympy停止计算表达式。
我将给予一个例子,我不希望冗余被简化。

import numpy as np
import sympy as sym

a,b,c = sym.symbols('a b c')

with sym.evaluate(False):
    exp1 = (c + b) - (b + c - a)

字符串
变量exp1应简化为a
但是,我不想这样。我想保留所有的操作。其中exp1 = (c + b) - (b + c - a)
我在一个with sym.evaluate(False):块中做了这个声明。
它打印exp1变量Ok。
然而,当变量被打印到屏幕上时,我没有计算的事情发生了。
print(exp1)
获取输出并将其分配给一个变量:
exp2 = (a - (b - c)) + (b + c) #这不是正确的表达式
print (exp1 - exp2) #不为零
为什么会这样?防止表达式求值的最佳方法是什么?
最好的问候

wqsoz72f

wqsoz72f1#

打印机更改输出顺序。您可以将顺序设置为none以禁用该命令:

In [88]: init_printing(order='none')

In [89]: import numpy as np
    ...: import sympy as sym
    ...: 
    ...: a,b,c = sym.symbols('a b c')
    ...: 
    ...: with sym.evaluate(False):
    ...:     exp1 = (c + b) - (b + c - a)
    ...: 

In [90]: exp1
Out[90]: c + b - (b + c - a)

字符串
不能保留c + b周围的括号,因为括号不是表达式的一部分:它们只是在需要时由打印机由于优先级而添加。
如果查看表达式的原始srepr表示,您可能会更清楚地了解发生了什么:

In [94]: srepr(exp1)
Out[94]: "Add(Add(Symbol('c'), Symbol('b')), Mul(Integer(-1), Add(Add(Symbol('b'), Symbol('c')), Mul(Integer(-1), Symbol('a')))))"

In [95]: print_tree(exp1, assumptions=False)
Add: -(-a + (b + c)) + (b + c)
+-Add: b + c
| +-Symbol: c
| +-Symbol: b
+-Mul: -(-a + (b + c))
  +-NegativeOne: -1
  +-Add: -a + (b + c)
    +-Add: b + c
    | +-Symbol: b
    | +-Symbol: c
    +-Mul: -a
      +-NegativeOne: -1
      +-Symbol: a

相关问题