为何在lambda函数中调用np.sum()失效?NumPy代码求助
NumPy优化约束函数错误排查与修复
我是第一次使用NumPy,非常抱歉提出基础问题,不清楚代码哪里出错了。标注#ERROR的为出错代码行,我推测可能是索引访问错误或值类型问题,提前感谢您的帮助。
原始代码
import numpy as np p = {1:100, 2:120, 3:130, 4:100, 5:90,6:180} M = {1:300, 2:120, 3:300} I = [1,2,3,4,5,6] J = [1,2,3] st_per = {(1,1):1, (1,2):2, (1,3):3, (2,1):4, (2,2):1, (2,3):1, (3,1):5, (3,2):2, (3,3):4, (4,1):3, (4,2):1, (4,3):2, (5,1):1, (5,2):2, (5,3):1, (6,1):0, (6,2):0, (6,3):0 } st_per2p = np.empty([len(I), len(J)]) for i in range(len(I)): for j in range(len(J)): st_per2p[i,j] = st_per[i+1,j+1] x0 = np.ones(len(st_per))*100 bounds = list((0,max(p.values())) for _ in range(st_per2p.size)) def ob(x): ob_func = sum(x[idx]*st_per2p[idx//len(J), idx%len(J)] for idx in range(st_per2p.size)) return ob_func def st_per1(): tmp = [] for idx in range(0, st_per2p.size, len(J)): tmp_constr = {'type': 'eq','fun': lambda x, idx: p[idx//len(J) + 1]–np.sum(x[idx: idx + len(J)]),'args': (idx,)} #ERROR tmp.append(tmp_constr) return tmp def st_per2(): tmp = [] for idx in range(0, st_per2p.size, len(I)): tmp_constr = {'type': 'ineq','fun': lambda x, idx=idx: M[idx//len(I) + 1]–np.sum(x[idx: idx + len(I)])} #ERROR tmp.append(tmp_constr) return tmp
错误分析与修复
两处错误代码的核心问题:
- 全角减号问题:代码中使用了中文全角减号
–,Python无法识别为算术运算符,需替换为英文半角减号-。 - lambda延迟绑定问题:
st_per1中的lambda函数未通过idx=idx绑定当前循环的idx值,会导致所有约束最终使用循环的最后一个idx,引发索引错误。
修正后的代码
import numpy as np p = {1:100, 2:120, 3:130, 4:100, 5:90,6:180} M = {1:300, 2:120, 3:300} I = [1,2,3,4,5,6] J = [1,2,3] st_per = {(1,1):1, (1,2):2, (1,3):3, (2,1):4, (2,2):1, (2,3):1, (3,1):5, (3,2):2, (3,3):4, (4,1):3, (4,2):1, (4,3):2, (5,1):1, (5,2):2, (5,3):1, (6,1):0, (6,2):0, (6,3):0 } st_per2p = np.empty([len(I), len(J)]) for i in range(len(I)): for j in range(len(J)): st_per2p[i,j] = st_per[i+1,j+1] x0 = np.ones(len(st_per))*100 bounds = list((0,max(p.values())) for _ in range(st_per2p.size)) def ob(x): ob_func = sum(x[idx]*st_per2p[idx//len(J), idx%len(J)] for idx in range(st_per2p.size)) return ob_func def st_per1(): tmp = [] for idx in range(0, st_per2p.size, len(J)): # 修复:替换全角减号 + 添加idx=idx绑定当前循环值 tmp_constr = {'type': 'eq','fun': lambda x, idx=idx: p[idx//len(J) + 1] - np.sum(x[idx: idx + len(J)]),'args': (idx,)} tmp.append(tmp_constr) return tmp def st_per2(): tmp = [] for idx in range(0, st_per2p.size, len(I)): # 修复:替换全角减号 tmp_constr = {'type': 'ineq','fun': lambda x, idx=idx: M[idx//len(I) + 1] - np.sum(x[idx: idx + len(I)])} tmp.append(tmp_constr) return tmp
内容的提问来源于stack exchange,提问作者ill_999
相关产品推荐
相关产品推荐

