You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:03:25