【问题标题】:List argument for a lambda function in pythonpython中lambda函数的列表参数
【发布时间】:2015-07-10 12:27:55
【问题描述】:

我使用 scipy optimize 最小化包。为了为我的问题提供约束,我需要创建一个庞大的元组。我这样做是通过以下方式:

c0 = [];
count = 0;
for i in range(0, Nx):
    for j in range(0, Ny):
        c0.append({'type': 'eq', 'fun': lambda x:  x[count]*x[count] + x[T + count]*x[T + count] + x[2*T + count]*x[2*T + count] - 1.});
        count+=1;
cons = tuple(c0);

但是当最小化器使用它们时,它总是取count的最终值,这显然会导致index out of bounds错误。尝试del(count) 导致另一个错误,所以我想我对 lambda 函数使用的 python 方式的理解有问题。也许有更好的使用切片和东西的python风格的方式?将不胜感激。

【问题讨论】:

标签: python lambda scipy


【解决方案1】:

变量中的 count 变量是在您调用 lambda 函数时计算的,而不是在您创建它时计算的(与其他一些语言不同)。您需要做的是强制复制此变量,一种方法可能是使用闭包:

c0.append({
        'type': 'eq', 
        'fun': (lambda count: lambda x:  x[count]*x[count] + x[T + count]*x[T + count] + x[2*T + count]*x[2*T + count] - 1.) (count)
});

另一种方式(棘手的方式 IMO)是用作参数的默认值:

c0.append({
    'type': 'eq', 
    'fun': lambda x, count = count:  x[count]*x[count] + x[T + count]*x[T + count] + x[2*T + count]*x[2*T + count] - 1.
});

【讨论】:

  • 非常感谢您的快速回复!这正是我想要的!
【解决方案2】:

你所做的是创建一个引用变量的函数对象,它不会创建自己的副本,所以当你去执行那个函数时,它会查找变量,它现在具有循环中的最后一个值。

@Holt 闭包可能是完成任务的最安全方法,尽管有点复杂。我会在闭包中更改变量的名称,以便更清楚地了解正在发生的事情。

它的作用是创建一个单独的范围,以便一旦执行离开外部 lambda 函数(调用它并返回一个值,这是您实际想要的函数对象),函数对象中的 count 变量和函数对象中的 count 变量您的循环不再引用内存中的相同位置,您可以在不影响函数引用的变量的情况下递增计数器。

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 2021-09-26
    • 2015-10-07
    • 2023-03-09
    • 1970-01-01
    • 2016-04-10
    相关资源
    最近更新 更多