You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在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

错误分析与修复

两处错误代码的核心问题:

  1. 全角减号问题:代码中使用了中文全角减号–,Python无法识别为算术运算符,需替换为英文半角减号-。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:12:48