重新排列符号输出



有没有办法控制sympy输出表达式的顺序? 例如:

>>> p
a*(-b*exp(x) + 1)

我可以强制 sympy 写入吗

a*(1 - b*exp(x))

相反?

(如果有人想知道 - 它通过 pylatex 直接进入 LaTeX 文档中,因此出于格式原因,顺序对我来说很重要)

恐怕没有办法做到这一点。我认为主要问题只是对于涉及减号的总和,顺序自然是"错误的"。有些情况已经修复,例如1 - x打印,如您所期望的那样 https://github.com/sympy/sympy/pull/15985 还有另一个开放的 PR 可以更普遍地解决问题: https://github.com/sympy/sympy/issues/16090

编辑:有init_printing(order='old')我以前不知道:

In [26]: a*(1 - b*exp(x))
Out[26]: 
⎛     x    ⎞
a⋅⎝- b⋅ℯ  + 1⎠
In [27]: init_printing(order='old')
In [28]: a*(1 - b*exp(x))
Out[28]: 
⎛       x⎞
a⋅⎝1 - b⋅ℯ ⎠
In [29]: latex(a*(1 - b*exp(x)))
Out[29]: 'a \left(1 - b e^{x}\right)'

我没有进行过广泛的测试,但它似乎按照我想要的方式工作。

作为一种解决方法,请考虑以下内容,该符号将应首先出现的符号代替第二个出现的符号,然后使用未计算的符号和替换来恢复原始术语:

def pos1st(expr):
from sympy.core.function import _coeff_isneg
a2 = []
for i in expr.atoms(Add):
if len(i.args) == 2:
a = i.as_ordered_terms()
if list(map(_coeff_isneg, i.as_ordered_terms())) == [
True, False]:
a2.append(a[1])
reps = [(i, Dummy(str(j))) for j,i in enumerate(a2)]
return S(str(expr.xreplace(dict(reps))), {str(i): j for j,i in reps},
evaluate=False)
>>> expr = x*(1 - b*exp(x))
>>> pos1st(expr)
x*(1 - b*exp(x))
>>> latex(_)
'x \left(1 - b e^{x}\right)'

最新更新