Как установить все полиномиальные коэффициенты равными 1 в многомерном выражении sympy

Предположим, у меня есть многомерный многочлен в sympy, например:

import sympy as sp
from sympy.abc import x,y,z

expr = 2*x**2*y*z - x*z + 5*y**4*z

Хорошо, я знаю, что мы можем извлечь все мономиальные коэффициенты в списке с помощью конструктора Poly:

pol = sp.Poly(expr)

>> pol.coeffs()
   [2, -1, 5]

Но как мне поступить, если я просто хочу нормализовать все коэффициенты многочлена, установив для них все равные 1? Окончательный ответ будет, следуя предыдущему примеру, примерно таким:

x**2*y*z + x*z + y**4*z
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
174
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете сделать это, используя манипуляции с выражением, например:

In [17]: Add.make_args(expr)
Out[17]: 
⎛         4       2    ⎞
⎝-x⋅z, 5⋅y ⋅z, 2⋅x ⋅y⋅z⎠

In [18]: terms = Add.make_args(expr)

In [19]: expr
Out[19]: 
   2                4  
2⋅x ⋅y⋅z - x⋅z + 5⋅y ⋅z

In [20]: terms = Add.make_args(expr)

In [21]: terms
Out[21]: 
⎛         4       2    ⎞
⎝-x⋅z, 5⋅y ⋅z, 2⋅x ⋅y⋅z⎠

In [22]: monoms = [t.as_coeff_Mul()[1] for t in terms]

In [23]: monoms
Out[23]: 
⎡      4     2    ⎤
⎣x⋅z, y ⋅z, x ⋅y⋅z⎦

In [24]: monpoly = Add(*monoms)

In [25]: monpoly
Out[25]: 
 2              4  
x ⋅y⋅z + x⋅z + y ⋅z

В одной строке это:

In [26]: Add(*(t.as_coeff_Mul()[1] for t in Add.make_args(expr)))
Out[26]: 
 2              4  
x ⋅y⋅z + x⋅z + y ⋅z

Вы также можете сделать это с Poly и используя мономы:

In [27]: p = Poly(expr, [x, y, z])

In [28]: p
Out[28]: Poly(2*x**2*y*z - x*z + 5*y**4*z, x, y, z, domain='ZZ')

In [29]: p.monoms()
Out[29]: [(2, 1, 1), (1, 0, 1), (0, 4, 1)]

In [30]: sum(prod(s**i for s, i in zip([x, y, z], indices)) for indices in p.monoms())
Out[30]: 
 2              4  
x ⋅y⋅z + x⋅z + y ⋅z

Если вы хотите выполнить аналогичные манипуляции, но на самом деле использовать коэффициенты, вы можете использовать as_coeff_Mul()[0] для коэффициентов или p.coeffs() в случае Poly.

В плоском выражении сохранить Mul часть термина просто с помощью replace. Первый аргумент может представлять то, что вы ищете, а второй — то, что вы хотите с этим сделать (хотя синтаксис гораздо богаче — см. строку документации):

>>> expr = 2*x**2*y*z - x*z + 5*y**4*z
>>> expr.replace(lambda x: x.is_Mul, lambda x: x.as_coeff_Mul()[1])
x**2*y*z + x*z + y**4*z

Другие вопросы по теме