Избегайте сортировки аргументов в модуле Python Sympy

В настоящее время я разрабатываю дифференциальный оператор для sympy, который может быть помещен в матричную форму. В этом случае порядок списка args при создании объекта Mul очень важен, чтобы гарантировать, что дифференциация выполняется там, где это требуется.

Проблема заключается в том, что, когда выполняется следующее:

input = (t,z,x)
Mul(*input).args

Он возвращает (t, x, z), потому что произошла некоторая перестановка в args. Как избежать сортировки args?

Ответ 1

Почему аргумент arg имеет важное значение для его правильности?

Единственный способ предотвратить это - установить, что ваши символы являются некоммутативными (x = Symbol('x', commutative=False)). Объекты SymPy сравниваются, сравнивая args, поэтому для работы x*y*z == y*x*z аргументы должны сортироваться канонически. Были некоторые попытки получить эту работу без явной сортировки (главным образом по соображениям производительности), но обратите внимание, что даже если бы мы это сделали, никаких гарантий относительно порядка arg, особенно если вы выполняете какую-либо операцию над выражением. Очень часто функции перестраивают выражения в SymPy, которые обычно используют какой-то другой несвязанный порядок от оригинала.