参数为函数的 lambdified 函数的 Lambda
Lambda of a lambdified function whose argument is a function
我目前正在尝试创建一个 lambda 函数,它将一个变量传递给作为 lambdified 函数输入的函数和 lambdified 函数本身。我的Python版本是2.7,我的sympy版本是1.3.
当传递正确的参数 (Y) 时,我能够让 lambdify 函数 (f) 正常工作。然后我尝试创建一个 lambda 函数,它将一个变量 (z) 传递给一个函数 (controlFunc),然后这两个函数都会被输入到我的 lambdify 函数 (f) 中。
问题似乎是 lambda 函数将在每次迭代中使用最新的 lambdify 函数(它应该如此)并更新所有先前的 lambda 函数以也使用最新的 lambdify 函数。我相信这不是我的代码中的错误,但我很容易出错。
我试过将 lambdify 函数设置为一个 vasriable,然后从中创建一个 lambda 函数。我尝试在 lambda 函数中使用整个 lambdify 函数。我什至尝试使用列表理解(我相信这是正确的术语)来评估列表中 lambdify 的每个 lambda。
import sympy as sy
import numpy as np
r,s,t,v,w,x,y = sy.symbols('r,s,t,v,w,x,y')
variables = [[t,v,w,x,y]]
inputs = [[r,s]]
L = [[]]
controlledSim = True
ctrl_input = [[10., 10.]]
def controlFunc(x,controlDict):
return ctrl_input[0]
control = [controlFunc for i in range(10)]
controlDict = []
func = [sy.Matrix([[1.*r*s*t*v*w*x*y],
[2.*r*s*t*v*w*x*y],
[3.*r*s*t*v*w*x*y],
[4.*r*s*t*v*w*x*y],
[5.*r*s*t*v*w*x*y]])]
X = [1.,1.,1.,1.,1.]
Y = [1.,1.,1.,1.,1.,10.,10.]
for j in range(len(L)):
if controlledSim == True:
func[j] = list(func[j])
temp = [[] for i in range(len(func[j]))]
f = [[] for i in range(len(func[j]))]
for i in range(len(func[j])):
f[i] = sy.lambdify([np.append(variables[j],inputs[j])], func[j][i])
temp[i] = lambda z: f[i](np.append(z,control[i](z,controlDict)))
func_lambda = lambda z: np.array([lamb(z) for lamb in temp]).T
我知道 func_lambda(X) 的输出应该是 [100.,200.,300.,400.,500.] 的数组。
我当前的结果是 [500.,500.,500.,500.,500.] 的数组。
循环内的 lambda 函数是一个很常见的问题。 Lambda 表达式在 call-time 处解析(不是在循环期间而是在之后)。考虑以下轻微修正:
temp[i] = lambda z, i=i: f[i](np.append(z,control[i](z,controlDict)))
i=i
是默认参数值,因此它在函数定义时解析。通过此修改 func_lambda(X)
给我 [100. 200. 300. 400. 500.]
.
我使用 python 3。但是这种方式也应该适用于 python 2。试试吧。
我目前正在尝试创建一个 lambda 函数,它将一个变量传递给作为 lambdified 函数输入的函数和 lambdified 函数本身。我的Python版本是2.7,我的sympy版本是1.3.
当传递正确的参数 (Y) 时,我能够让 lambdify 函数 (f) 正常工作。然后我尝试创建一个 lambda 函数,它将一个变量 (z) 传递给一个函数 (controlFunc),然后这两个函数都会被输入到我的 lambdify 函数 (f) 中。
问题似乎是 lambda 函数将在每次迭代中使用最新的 lambdify 函数(它应该如此)并更新所有先前的 lambda 函数以也使用最新的 lambdify 函数。我相信这不是我的代码中的错误,但我很容易出错。
我试过将 lambdify 函数设置为一个 vasriable,然后从中创建一个 lambda 函数。我尝试在 lambda 函数中使用整个 lambdify 函数。我什至尝试使用列表理解(我相信这是正确的术语)来评估列表中 lambdify 的每个 lambda。
import sympy as sy
import numpy as np
r,s,t,v,w,x,y = sy.symbols('r,s,t,v,w,x,y')
variables = [[t,v,w,x,y]]
inputs = [[r,s]]
L = [[]]
controlledSim = True
ctrl_input = [[10., 10.]]
def controlFunc(x,controlDict):
return ctrl_input[0]
control = [controlFunc for i in range(10)]
controlDict = []
func = [sy.Matrix([[1.*r*s*t*v*w*x*y],
[2.*r*s*t*v*w*x*y],
[3.*r*s*t*v*w*x*y],
[4.*r*s*t*v*w*x*y],
[5.*r*s*t*v*w*x*y]])]
X = [1.,1.,1.,1.,1.]
Y = [1.,1.,1.,1.,1.,10.,10.]
for j in range(len(L)):
if controlledSim == True:
func[j] = list(func[j])
temp = [[] for i in range(len(func[j]))]
f = [[] for i in range(len(func[j]))]
for i in range(len(func[j])):
f[i] = sy.lambdify([np.append(variables[j],inputs[j])], func[j][i])
temp[i] = lambda z: f[i](np.append(z,control[i](z,controlDict)))
func_lambda = lambda z: np.array([lamb(z) for lamb in temp]).T
我知道 func_lambda(X) 的输出应该是 [100.,200.,300.,400.,500.] 的数组。
我当前的结果是 [500.,500.,500.,500.,500.] 的数组。
循环内的 lambda 函数是一个很常见的问题。 Lambda 表达式在 call-time 处解析(不是在循环期间而是在之后)。考虑以下轻微修正:
temp[i] = lambda z, i=i: f[i](np.append(z,control[i](z,controlDict)))
i=i
是默认参数值,因此它在函数定义时解析。通过此修改 func_lambda(X)
给我 [100. 200. 300. 400. 500.]
.
我使用 python 3。但是这种方式也应该适用于 python 2。试试吧。