【问题标题】:In sympy, how functional expression can be translated into operator overloaded expression?在 sympy 中,如何将函数表达式转换为运算符重载表达式?
【发布时间】: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'?

谢谢

【问题讨论】:

    标签: python expression sympy prefix infix-notation


    【解决方案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 以了解其工作原理)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2014-08-24
    • 2021-07-30
    • 1970-01-01
    相关资源
    最近更新 更多