在 SymPy 中,我如何构建一个改变输入表达式的函数?

In SymPy, how might I build a function that alters an input expression?

我是 sympy 和计算机代数系统的新手。我想创建一个函数,它可以接受一个扩展表达式和 return 一个表达式,其中的幂被 1 替换。例如,如果函数被命名为 unpower:

>>> unpower(x*y**3 + x**2)
x*y + x

可以这样做吗?如果可以,我可以从文档的什么地方开始学习如何做? Tips/advice 欢迎!

这是一个更高级的替换练习,因为您想要匹配任何幂的指​​数。所有 SymPy 对象都有属性;最基本的 属性 是 args,它告诉您对象的参数是什么。

>>> (x**y).args
(x, y)

有时不同的参数有 baseexp 之类的名称,对于 Pow 的参数,您可以查询一个对象以找出它是什么:

>>> (x**y).exp
y
>>> (1/x).is_Pow
True

replace 方法——参见 help(Basic.replace)——非常适合您的需要,因为它只能针对幂

>>> (x*y**3 + x**2).replace(lambda _: _.is_Pow, lambda _: _.base)
x*y + x

但您可能希望保留指数符号,否则

>>> (x/y).replace(lambda _: _.is_Pow, lambda _: _.base)
x*y

所以也许

>>> from sympy import sign
>>> unpow = lambda e: e.replace(lambda _: _.is_Pow, lambda _: _.base**sign(_.exp))
>>> unpow(x**3/y**2)
x/y