python - 如何在 lambda 表达式中保持某些参数不变
问题描述
情况:我正在使用 scipy 来解决优化问题。由于需要许多约束,系数位于 pandas.dataframe 对象中。我正在尝试使用循环输入所有这些约束。问题是在下一个周期,参数已经改变,所以实际上只剩下了约束。
为了更清楚地表达问题,我举个例子(在这个例子中,只给出了几个参数。但在实际情况下,可能有50多个参数)。Step1:我使用的代码如下:约束是w1 + w2 * 2 >= 0; w1 * 3 + w2 * 5 >= 0
cons = []
d = {
'type': 'ineq',
'fun': ''}
a = np.array([1,2])
d['fun'] = lambda w: a.dot(w)
cons.append(d.copy())
a = np.array([3,5])
d['fun'] = lambda w: a.dot(w)
cons.append(d.copy())
cons
Step2:使用如下所示的代码测试cons:只使用w作为[1, 1],我预计cons中存储的fun会输出3和8,但实际上是8和8。
w = np.array([1,1])
for each in cons:
fun = each['fun']
print(fun(w))
任何人都可以就如何解决这个问题提供一些帮助吗?或者只是出了点问题。
解决方案
问题是你重新定义a
.
此代码将您的第二个定义重命名为a
tob
并给出您期望的结果:
import numpy as np
cons = []
d = {
'type': 'ineq',
'fun': ''}
a = np.array([1, 2])
d['fun'] = lambda w: a.dot(w)
cons.append(d.copy())
b = np.array([3, 5])
d['fun'] = lambda w: b.dot(w)
cons.append(d.copy())
print(cons)
c = np.array([1, 1])
for each in cons:
fun = each['fun']
print(fun(c))
请注意,这解决了您当前的问题,但这并不意味着这是您尝试解决的问题的最佳或非常强大的解决方案。
我想你在这里寻找的是functools.partial
. 这是您的代码,但重写为使用partial
:
import numpy as np
from functools import partial
def get_dot(a, w):
return a.dot(w)
cons = []
d = {
'type': 'ineq',
'fun': None
}
d['fun'] = partial(get_dot, np.array([1, 2]))
cons.append(d.copy())
d['fun'] = partial(get_dot, np.array([3, 5]))
cons.append(d.copy())
print(cons)
g = np.array([1, 1])
for each in cons:
fun = each['fun']
print(fun(g))
推荐阅读
- nlp - 如何同时进行序列标记和实体关系标记
- python - 如何按频率对字典值进行排序
- javascript - 当我发布数据并使用架构时,axios.post 中的内部服务器错误
- python - Numpy,从没有分隔符的文件中读取,最有效的方法
- android-jetpack-compose - Jetpack compose 来到前台时如何重构
- javascript - JavaScript 函数仅在有 2 个输入框时触发
- python - Tkinter 按钮隐藏在其他框架后面
- flutter - 如何将卡片小部件放在 SliverAppBar 中?
- reactjs - 在 Google 的 Place Autocomplete Address api 中获取 Cors 政策错误
- android - 无法检测到实时检查服务。要启用实时检查,请重新启动设备