【问题标题】:Enforce custom ordering on Sympy print在 Sympy 打印上强制执行自定义排序
【发布时间】:2017-11-08 22:03:18
【问题描述】:

SymPy 在跟踪我对符号表达式所做的所有操作方面做得非常出色。但是在打印乳胶输出结果的那一刻,我想强制执行该术语的某种顺序。这只是为了约定,不幸的是,该约定在符号名称上不是按字母顺序排列的(就像sympy 一样合理)

import sympy as sp
sp.init_printing()
U,tp, z, d = sp.symbols('U t_\perp z d')
# do many operations with those symbols
# the final expression is:

z+tp**2+U+U/(z-3*tp)+d

我的问题是SymPy 将表达式排序为

U + U/(-3*t_\perp + z) + d + t_\perp**2 + z

但是这种排序不是我领域的惯例。对我们来说,z 必须是最左边的表达式,然后是 tp,然后是 U,即使它是大写的,d 也是最不相关的,放在右边。所有这些变量都具有特定的含义,这就是我们以这种顺序编写它们的原因,并且代码中的变量以这种方式命名的原因。

我不想将z 重命名为a 并按照Prevent Sympy from rearranging the equation 中的建议,然后在打印时将a 转换为z。在Force SymPy to keep the order of terms 中有一个提示,我可以编写一个排序函数,但我找不到关于它的文档。

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    如果您可以按照您想要的顺序排列条款,那么将 Latex 打印机的 order 标志设置为“无”将按该顺序打印它们。

    >>> import sympy as sp
    >>> sp.init_printing()
    >>> U,tp, z, d = sp.symbols('U t_\perp z d')
    >>> eq=z+tp**2+U+U/(z-3*tp)+d
    

    在这里,我们将它们按顺序排列(知道tp 的幂为 2)并使用 evaluate=False 重建为 Add 以保持顺序不变

    >>> p = Add(*[eq.coeff(i)*i for i in (z, U, tp**2, d)],evaluate=False)
    

    现在我们使用带有order='none' 的打印机实例打印该表达式:

    >>> from sympy.printing.latex import LatexPrinter
    >>> s=LatexPrinter(dict(order='none'))
    >>> s._print_Add(p)
    z + U \left(1 + \frac{1}{z - 3 t_\perp}\right) + t_\perp^{2} + d
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      相关资源
      最近更新 更多