元组中有函数参数的同胚



假设您已经将fu作为症状计算的结果:

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

其中

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

是符号。现在您想要将fu转换为(显然(两个变量的numpy函数。您可以通过以下方式完成:

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

产生CCD_ 3。有没有一种方法lambdify可以用x,y=z产生fun(z),即产生以下函数:

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

根据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中无法做到这一点,我们也可以定义一个薄包装器,将参数解包到精简函数中(尽管这会使每次调用的一个函数调用速度变慢,因此对于多次调用的快速函数来说,这可能会对运行时产生可衡量的影响(:

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自动生成的文档字符串。

最新更新