在 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 所做的一部分,并且还提供了长英文版AndOr 函数调用以方便键入以及在某些情况下的可读性。

【讨论】:

感谢您的详细回复。是否有任何简单的函数可以将字符串变量 '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 打印机使用 AndOr 而不是 &| 符号来打印逻辑表达式,所以如果你明确想要这些,你需要继承 sympy.printing.str.StrPrinter 和覆盖 _print_And_print_Or(请参阅 current implementation 以了解其工作原理)。

【讨论】:

我已经打开了一个问题来更改 SymPy 中的默认打印github.com/sympy/sympy/issues/11435 我发现它很好地解决了我的问题。谢谢你的好提示。

以上是关于在 sympy 中,如何将函数表达式转换为运算符重载表达式?的主要内容,如果未能解决你的问题,请参考以下文章

Sympy - 生成 C 代码。将 Rational 转换为浮点数

使用python的sympy解符号方程组后,如何将结果带入之后的符号表达式

使用sympy进行表达式化简

将 SymPy 矩阵转换为 numpy 数组/矩阵的最佳方法是啥

Python - 将符号表达式(sympy)写入txt文件

使用 Sympy 生成 C 代码。将 Pow(x,2) 替换为 x*x