sympy lambdify 与元组中的函数参数?

sympy lambdify with function arguments in tuple?

假设您计算了 fu 作为 sympy 计算的结果:

fu= sy.cos(x)+sy.sin(y)+1

其中

x,y = sy.symbols("x y")

是符号。现在您想将 fu 转换为(显然)两个变量的 numpy 函数。 您可以通过以下方式做到这一点:

fun= sy.lambdify((x,y), fu, "numpy")

然后你生产 fun(x,y)。有没有办法让lambdifyx,y=z生成fun(z),即生成下面的函数:

def fun(z):
   x,y=z
   return np.cos(x)+np.sin(y)+1   

根据the documentation of lambdify,您可以将符号嵌套在第一个参数中以表示签名中的解包:

import sympy as sym

x,y = sym.symbols('x y')
fu = sym.cos(x) + sym.sin(y) + 1

# original: signature f1(x, y)
f1 = sym.lambdify((x,y), fu)
f1(1, 2)  # returns 2.4495997326938213

# nested: signature f2(z) where x,y = z
f2 = sym.lambdify([(x,y)], fu)
f2((1, 2))  # returns 2.4495997326938213

即使这不可能在 lambdify 内完成,我们也可以定义一个精简包装器,将参数解包到 lambdified 函数(尽管每次调用都会慢一个函数调用,所以对于被调用很多次的快速函数,这可能会对运行时产生可衡量的影响):

f = sym.lambdify((x,y), fu)  # signature f(x,y)
def unpacking_f(z):  # signature f(z) where x,y = z
    return f(*z)

当然,如果该函数不是在数值求解器中一次性使用(例如曲线拟合或最小化),则最好使用 functools.wraps 作为包装器。这将保留 lambdify.

自动生成的文档字符串