Предположим, у меня есть многомерный многочлен в 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
Вы можете сделать это, используя манипуляции с выражением, например:
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