Python 如何在多元辛表达式中将所有多项式系数设置为1

Python 如何在多元辛表达式中将所有多项式系数设置为1,python,sympy,polynomials,Python,Sympy,Polynomials,假设我有一个多元多项式,例如: import sympy as sp from sympy.abc import x,y,z expr = 2*x**2*y*z - x*z + 5*y**4*z 好的,我知道我们可以使用多边形构造函数提取列表中的所有单项系数: pol = sp.Poly(expr) >> pol.coeffs() [2, -1, 5] 但是,如果我只想通过将多项式的所有系数都设置为1来规范化它们,我该如何继续呢? 根据前面的示例,最终答案如下: x**

假设我有一个多元多项式,例如:

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

expr = 2*x**2*y*z - x*z + 5*y**4*z
好的,我知道我们可以使用多边形构造函数提取列表中的所有单项系数:

pol = sp.Poly(expr)

>> pol.coeffs()
   [2, -1, 5]
但是,如果我只想通过将多项式的所有系数都设置为1来规范化它们,我该如何继续呢? 根据前面的示例,最终答案如下:

x**2*y*z + x*z + y**4*z

您可以使用Expr操纵来执行此操作,如:

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和monoms执行此操作:

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]
,或在
Poly
情况下使用
p.coefs()