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。在Python - SymPy - Force SymPy to keep order中有一个提示我可以写一个排序函数,但我找不到有关它的文档。
答案 0 :(得分:0)
如果您可以按想要的顺序排列这些术语,然后将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