强制 Sympy 打印自定义顺序

10

SymPy 在记录我的符号表达式进行的所有操作方面做得非常出色。但在打印结果以便用于 LaTeX 输出时,我想强制执行某些项的特定排序。这只是为了惯例,并且不幸的是,该惯例并不是根据符号名称的字母顺序排列(就像 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,即使它是大写的,其次才是 Ud 是最不相关的,应该放在右边。所有这些变量都具有特定的含义,这就是为什么我们按照这种顺序编写它们的原因,也是变量在代码中被命名的原因。

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

1个回答

5

如果您可以按照自己的顺序排列术语,那么将Latex打印机的order标志设置为“none”将按照您的顺序打印它们。

>>> 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接