在 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)
有时不同的参数有 base
和 exp
之类的名称,对于 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
我是 sympy 和计算机代数系统的新手。我想创建一个函数,它可以接受一个扩展表达式和 return 一个表达式,其中的幂被 1 替换。例如,如果函数被命名为 unpower
:
>>> unpower(x*y**3 + x**2)
x*y + x
可以这样做吗?如果可以,我可以从文档的什么地方开始学习如何做? Tips/advice 欢迎!
这是一个更高级的替换练习,因为您想要匹配任何幂的指数。所有 SymPy 对象都有属性;最基本的 属性 是 args
,它告诉您对象的参数是什么。
>>> (x**y).args
(x, y)
有时不同的参数有 base
和 exp
之类的名称,对于 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