Python 在Symphy打印上强制执行自定义订购
Python 在Symphy打印上强制执行自定义订购,python,sympy,Python,Sympy,symphy做了一件很棒的工作,记录了我对符号表达式所做的所有操作。但在打印乳胶输出结果的那一刻,我想强制执行该术语的某种排序。这只是约定,不幸的是,约定在符号名称上不是按字母顺序排列的(正如合理的sympy所做的那样) 我的问题是SymPy将表达式按顺序表示为 U + U/(-3*t_\perp + z) + d + t_\perp**2 + z 但这种排序在我的领域里不是惯例。对于我们来说,z必须是最左边的表达式,然后是tp,然后是U,即使它是大写的,d是最不相关的,并且放在右边。所有这些
symphy
做了一件很棒的工作,记录了我对符号表达式所做的所有操作。但在打印乳胶输出结果的那一刻,我想强制执行该术语的某种排序。这只是约定,不幸的是,约定在符号名称上不是按字母顺序排列的(正如合理的sympy
所做的那样)
我的问题是SymPy
将表达式按顺序表示为
U + U/(-3*t_\perp + z) + d + t_\perp**2 + z
但这种排序在我的领域里不是惯例。对于我们来说,z
必须是最左边的表达式,然后是tp
,然后是U
,即使它是大写的,d
是最不相关的,并且放在右边。所有这些变量都有一个特定的含义,这就是为什么我们按这样的顺序编写它们,代码变量中的原因也是这样命名的
我不想将
z
重命名为a
,并按照中的建议,然后在打印时将a
转换为z
。在这里有一个提示,我可以写一个排序函数,但我找不到有关它的文档 如果您可以按您想要的顺序放置术语,则将Latex打印机的顺序
标记设置为“无”将按该顺序打印
>>> 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
>>> 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