我目前正在开发一个可以以矩阵形式放置的微分算子。sympy
在这种情况下,args
创建Mul
对象时列表的顺序对于保证仅在需要的地方执行区分非常重要。
问题是,当完成以下操作时:
input = (t,z,x)
Mul(*input).args
它返回(t, x, z)
是因为args
发生了一些重新排列。如何避免args
被排序?
我目前正在开发一个可以以矩阵形式放置的微分算子。sympy
在这种情况下,args
创建Mul
对象时列表的顺序对于保证仅在需要的地方执行区分非常重要。
问题是,当完成以下操作时:
input = (t,z,x)
Mul(*input).args
它返回(t, x, z)
是因为args
发生了一些重新排列。如何避免args
被排序?
为什么 arg 排序对于它的正确性很重要?
防止这种情况的唯一方法是将符号设置为不可交换的 ( x = Symbol('x', commutative=False)
)。SymPy 对象通过比较 进行比较args
,因此为了x*y*z == y*x*z
工作,必须对 args 进行规范排序。有一些尝试在没有显式排序的情况下使其工作(主要是出于性能原因),但请注意,即使我们这样做了,也无法保证 arg 顺序,特别是如果您对表达。函数在 SymPy 中重建表达式是很常见的,这通常会使用原始的一些其他不相关的顺序。