【问题标题】:Sympy patterns for functions函数的 Sympy 模式
【发布时间】:2021-04-07 19:16:28
【问题描述】:

在 Wolfram Research Mathematica 中,可以定义类型的替换规则

sustitution = g_[arg___] -> g[Sequence @@ Reverse[{arg}]]

然后可以将其应用于涉及函数的不同表达式,结果如下:

f[x, y] /. sustitution   >>  f[y,x]
g[x1,x2,x3]              >>  g[x3,x2,x1]
h[1,z,w,t]/.sustitution  >>  h[t,w,z,1]

由于可以使用名称为 g_ 的模式作为函数名称,而使用另一个模式 arg___ 作为参数,因此无论表达式中出现的函数名称如何,相同的替换规则都是有效的.

是否可以使用 WildFunction 符号和替换来获得与 Sympy 类似的效果?

【问题讨论】:

    标签: python design-patterns wolfram-mathematica sympy


    【解决方案1】:

    arg__ 对于 SymPy 类型的 arg-remapping 函数不是必需的,因为可以从函数调用本身中检索 args:

    >>> from sympy.abc import x,y,z
    >>> from sympy import Function
    >>> f = Function('f')
    >>> g_ = lambda f: f.func(*list(reversed(f.args)))
    >>> g_(f(x,y,z))
    f(z, y, x)
    

    在表达式中以相同方式更改所有用户定义函数的另一种方法是使用replace,如下所示:

    >>> from sympy.abc import *
    >>> from sympy import Function, AppliedUndef
    >>> f,g,h,F=symbols('f,g,h,F',cls=Function)
    >>> eq=f(x,y,z)+g(y,x,w)*h(1,u,t)**cos(F(x,y,1,w))
    >>> eq.replace(
    ... lambda x: isinstance(x, AppliedUndef),
    ... lambda x: x.func(*list(reversed(x.args))))
    f(z, y, x) + g(w, x, y)*h(t, u, 1)**cos(F(w, 1, y, x))
    

    如果您想将这种转换应用于所有函数,请使用Function 而不是AppliedUndef

    【讨论】:

    • 非常感谢@smichr,但我想在更困难的表达式中应用替换为codef(x,y,z)+g(y,x,w)*h(1 ,g,t)**cos(F(x,y,1,w))code 左右。出于这个原因,我正在考虑使用替换和 WildFunction 符号。我的目标是更好地理解如何通过 WildFunction 符号来控制 sympy 函数符号的属性,以及是否可以用它们重现模式 Mathematica 风格。
    • 亲爱的@smichr,我想到了另一个解决方案:code F=WildFunction("F")code code (f(x,y)+g(x,y, z)).replace(F , lambda F:F.func(*list(reversed(F.args))))code.我想知道为什么无法访问 WildFunction 符号的信息,并且受到您的回答的启发,我尝试了这个。我看到如果您尝试 F.func 或 F.args 而不使用 lambda,您会收到错误消息。最佳。
    猜你喜欢
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    相关资源
    最近更新 更多