假设您已经根据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)
。有没有一种方法lambdify
能产生fun(z)
与x,y=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
,我们也可以定义一个精简包装器,以将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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句