Как добавить генератор к объекту Sympy Poly?

Я пишу несколько тестов для своего sympy-кода, и, естественно, мне нужно сравнить две sympy-матрицы. Каждая матрица содержит объекты типа Poly в качестве записей (фактически, она содержит объекты класса, который я создал, который расширяет класс Poly, но это не должно иметь значения).

Проблема в том, что когда я пытаюсь сравнить эти объекты в тестах, хотя выражения одинаковы, генераторы разные, что приводит к провалу теста, даже если они одинаковы.

Например:

from sympy.matrices import Matrix 

expected_matrix = Matrix([[Poly(1.0*y1 + 2.0*x2 + 1.0*x1, y1, x2, x1, domain='RR')]])

actual_matrix = Matrix([[Poly(1.0*y1 + 1.0*x2, y2, y1, x2, x1, domain='RR') + Poly(1.0*x2 + 1.0*x1, y2, y1, x2, x1, domain='RR')]])

# however, when these get compared, they don't agree because notice that the `y2` generator does not appear in the `expected_matrix`.

У меня вопрос, как уравнять генераторы. Как добавить генераторы к фактическому результату? Или убрать генераторы с ожидаемого выхода?

Поскольку атрибут gens является кортежем, это усложняет задачу, потому что я не могу просто добавить элемент в атрибут gens:

actual_matrix.gens = expected_matrix.gens

Возможно, я мог бы сравнить только выражения, но это кажется мне рискованным (если только кто-то с большим опытом в этом не убедит меня в обратном).

Как мне сравнить эти две вещи?


person makansij    schedule 19.09.2019    source источник


Ответы (1)


Если вы конвертируете Polys в матрицах в выражения, это сработает.

>>> expected_matrix.applyfunc(lambda x:x.as_expr())==actual_matrix.applyfunc(lambda x:x.as_expr())
True
person smichr    schedule 20.09.2019
comment
Правильно, похоже, вы сравниваете выражения (об этом я упоминал в конце своего вопроса). Это кажется рискованным, потому что, как правило, могут быть два одинаковых выражения, но они могут иметь разные области или разные символы. Есть другой способ сделать это? - person makansij; 20.09.2019
comment
Если вы хотите, чтобы Polys с одними и теми же символами, но с разными доменами сравнивали по-разному, вам нужно будет создать свою собственную процедуру сравнения, начиная с Poly(x, domain=RR)==Poly(x,domain=ZZ) -> True. В таком случае вы можете сравнить списки элементов с list(map(lambda x: (x.as_expr(), x.domain), Matrix([Poly(x,domain=ZZ)]))) для каждой матрицы. - person smichr; 21.09.2019