使用 sympy.replace 和 Wild 符号来匹配和替换任意函数

问题描述 投票:0回答:1

是否可以使用 sympy Wild 符号并替换来匹配任意函数应用程序?

我最想做的是:

x = Symbol('x')
expr1 = sin(x)
expr2 = exp(x)
F = Wild('F') #or maybe WildFunction('F')?
result1 = expr1.replace(F(x), lambda F: F(tan(x)))    #expected: sin(tan(x))
result2 = expr2.replace(F(x), lambda F: F(tan(x)))    #expected: exp(tan(x))

不幸的是,这不起作用:它会抛出 TypeError,因为 Wild 符号不可调用。 那么有没有办法让这项工作发挥作用呢?请注意,我真的不想匹配和替换特定函数,也不想匹配和替换像 Function('f') 这样的符号函数。我想匹配和替换任意(sympy?)函数,例如 sin、exp、im、tan、re、conjguate 等。

有效的是

F = WildFunction('F')
result1 = expr1.replace(F, lambda F: F.func(*F.args))

但是感觉有点不自然,脆弱。

谢谢!

python pattern-matching sympy symbolic-math
1个回答
0
投票

是的,但是您正在寻找

properties
并获取 Wild 匹配的 type 来嵌套函数调用!

>>> F = Wild("F", properties=[lambda F: F.is_Function])
>>> expr1.replace(F, lambda F: type(F)(tan(x)))
sin(tan(x))

或者对哪些功能被替换更加挑剔

>>> F = Wild("F", properties=[lambda F: type(F) in [sin,tan,cos]])
>>> (sin(x) + cosh(x) + cos(x)).replace(F, lambda F: type(F)(csc(x)))
sin(csc(x)) + cos(csc(x)) + cosh(x)

一个有点无耻的插件,但也请查看我关于 Wild 的属性Replace 如何工作 的其他答案!

© www.soinside.com 2019 - 2024. All rights reserved.