在 sympy 中,如何将函数表达式转换为运算符重载表达式?
Posted
技术标签:
【中文标题】在 sympy 中,如何将函数表达式转换为运算符重载表达式?【英文标题】:In sympy, how functional expression can be translated into operator overloaded expression? 【发布时间】:2016-07-25 12:01:12 【问题描述】:最近我正在使用布尔网络,我正在使用 sympy 来操作布尔函数。我认为这可能是一个非常基本的问题,但我找不到任何线索。
以下线路运行良好。
>>>from sympy import *
>>>x,y = symbols("x y")
>>>(x | y) & x
And(Or(x, y), x)
在这里,我有一个非常简单的问题。 'And(Or(x, y), x)' 表达式如何表示为 '(x | y) & x'?
谢谢
【问题讨论】:
【参考方案1】:Sympy 广泛使用 Python 运算符重载功能。
在 Python 中,每个类都可以定义为任何数学运算符都会生效,通过定义具有特殊名称的方法 - 这些方法总是以__
为前缀和后缀,并在Python Data Model 中进行了描述。
Sympy 符号和表达式是重新定义所有与运算符相关的方法以执行返回 Sympy 表达式对象而不是数字结果的操作的对象。
因此,bynary 和&
dbinary 或|
的运算符只是Sympy 所做的一部分,并且还提供了长英文版And
和Or
函数调用以方便键入以及在某些情况下的可读性。
【讨论】:
感谢您的详细回复。是否有任何简单的函数可以将字符串变量 'And(Or(x, y), x)' 转换为字符串变量 '(x | y) & x'?如果解决方案不简单,那么您能给出一些提示吗?【参考方案2】:如果你只是想要更好的打印,你可以运行
init_printing()
它会使用 Unicode 字符打印它,如果可用的话,甚至是 LaTeX(比如在 Jupyter notebook 中)
In [1]: (x | y) & x
Out[1]: x ∧ (x ∨ y)
您也可以使用pprint()
函数直接获取此信息。
看起来默认的 SymPy 打印机使用 And
和 Or
而不是 &
和 |
符号来打印逻辑表达式,所以如果你明确想要这些,你需要继承 sympy.printing.str.StrPrinter
和覆盖 _print_And
和 _print_Or
(请参阅 current implementation 以了解其工作原理)。
【讨论】:
我已经打开了一个问题来更改 SymPy 中的默认打印github.com/sympy/sympy/issues/11435 我发现它很好地解决了我的问题。谢谢你的好提示。以上是关于在 sympy 中,如何将函数表达式转换为运算符重载表达式?的主要内容,如果未能解决你的问题,请参考以下文章
Sympy - 生成 C 代码。将 Rational 转换为浮点数
使用python的sympy解符号方程组后,如何将结果带入之后的符号表达式