【问题标题】:Passing string into a lambda function将字符串传递给 lambda 函数
【发布时间】:2021-06-06 16:45:02
【问题描述】:

我正在尝试在给定字符串列表列表的情况下自动生成 lambda 函数,以便为 scipy.optimize.minimize() 例程生成约束。我有一个 list 的字符串对,我需要将其传递给每个 lambda 函数约束,如下所示:

list = [
["parameter1", "parameter2"],
["parameter3", "parameter4"]
]

constraints = []
for pair in list:
    constraints.append( {"type":"ineq","fun": lambda p: p[param_names.index(pair[0])]-p[param_names.index(pair[1])]} )

但是,当将此约束列表传递给scipy.optimize.minimize() 时,这些约束将被忽略。或者,当我像这样明确定义字符串时

cons = [
{'type':'ineq','fun': lambda p: p[param_names.index("parameter1")]-p[param_names.index("parameter2")] },
{'type':'ineq','fun': lambda p: p[param_names.index("parameter3")]-p[param_names.index("parameter4")] }
]

scipy.optimize.minimize() 遵守约束。我相信这是我如何定义 lambda 函数的问题,即尝试将变量(字符串)传递给 lambda 函数,而不是 scipy.optimize.minimize() 的问题。我需要我的代码能够解析上述字符串对列表,以自动定义这些 lambda 函数和约束,因为列表可能会因情况而异。

有没有办法将 lambda 函数外部的变量传递给 lambda 函数?或者我应该这样做的另一种方式?

【问题讨论】:

  • 可以肯定的是,列表中的某些字符串缺少“e”(cmp.:paramter1parameter1)。错别字?
  • 是的,这是一个错字,抱歉。
  • 所以没有错字代码可以按预期工作?
  • 错字不会改变问题或问题。这是我在此处输入问题时的错误。
  • 您能提供一个minimal, reproducible example吗?我无法重现所描述的行为。

标签: python numpy lambda scipy


【解决方案1】:

请参阅this answer 以了解类似问题。在您的情况下,问题是在 lambda 表达式中使用名称 pair 。由于 Python 的 late-binding closurespair 将引用它在评估 lambda 时的值,而不是定义 lambda 时的值。在您的代码中,这可能意味着 pair 将始终引用 list 中的 last 元素。

一个可能的fix

constraints = []
for pair in list:
    constraints.append({"type": "ineq", "fun": lambda p, pair=pair: p[param_names.index(pair[0])]-p[param_names.index(pair[1])]})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-28
    • 2013-12-11
    • 2011-05-12
    • 2016-12-08
    • 2018-01-15
    相关资源
    最近更新 更多