根据文档,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
.