SymPy中如何正确获取Poly多项式对象的第一个参数
SymPy Poly对象获取原始传入表达式的方法
使用SymPy进行符号计算时,将多项式转为Poly对象后再转字符串,会出现项顺序自动调整的问题:例如输入h**2+x**2,生成Poly对象后输出字符串为x**2 + h**2。需要找到不依赖字符串解析、直接获取Poly对象对应原始表达式的可行方案。
已尝试的无效/不稳定方案
正则匹配字符串
最初尝试通过正则匹配Poly对象的字符串输出提取内容,测试代码如下:
from sympy import * import re var('x h') myPoly=h**2+x**2 print("#",myPoly) print("#",re.findall('\(.*x',str(Poly(myPoly,x)))[0].lstrip("(").rstrip(", x")) myPoly=h**2+3*h*x +3*x**2 print("#",myPoly) print("#",re.findall('\(.*x',str(Poly(myPoly,x)))[0].lstrip("(").rstrip(", x")) # h**2 + x**2 # x**2 + h**2 # h**2 + 3*h*x + 3*x**2 # 3*x**2 + 3*h*x + h**2
该方案完全依赖字符串输出格式,稳定性极差,SymPy版本迭代调整输出规则后会直接失效。
读取args属性
后续参考SymPy polytools模块源码中args方法的定义,尝试通过args属性获取参数,测试代码如下:
from sympy import * import re var('x h') myPoly=h**2+x**2 print("#",myPoly) print("#",myPoly.args) print("#",Poly(myPoly,x).args) myPoly=h**2+3*h*x +3*x**2 print("#",myPoly) print("#",myPoly.args) print("#",Poly(myPoly,x).args) # h**2 + x**2 # (h**2, x**2) # (h**2 + x**2, x) # h**2 + 3*h*x + 3*x**2 # (h**2, 3*x**2, 3*h*x) # (h**2 + 3*h*x + 3*x**2, x)
测试验证:普通SymPy表达式的args属性会返回拆分后各项组成的元组,但Poly对象的args属性仅返回(完整多项式表达式, 自变量)格式的元组,无法获取按原始传入顺序保留的项内容。
正确实现方法
直接调用Poly对象自带的as_expr()方法,即可获取构造Poly时传入的原始多项式表达式,保留原始项顺序,无需做任何字符串解析:
from sympy import * var('x h') p1 = Poly(h**2 + x**2, x) print(p1.as_expr()) # 输出 h**2 + x**2 p2 = Poly(h**2 + 3*h*x + 3*x**2, x) print(p2.as_expr()) # 输出 h**2 + 3*h*x + 3*x**2
如果需要获取拆分后的单项列表,对as_expr()返回的普通SymPy表达式读取args属性即可:
print(p1.as_expr().args) # 输出 (h**2, x**2) print(p2.as_expr().args) # 输出 (h**2, 3*x**2, 3*h*x)
操作SymPy对象时不要依赖字符串解析提取内容,所有内部属性都有对应的官方API可以调用,字符串解析方案在版本升级时极易出现兼容问题。
内容的提问来源于stack exchange,提问作者mrrclb48z
相关产品推荐
相关产品推荐

