Python中结果依赖场景下的索引越界错误排查
解决IndexError:索引超出矩阵范围的问题
咱们先来拆解你遇到的错误:IndexError: index 99 is out of bounds for axis 0 with size 99,意思是你试图访问一个只有99行的矩阵的第99行(索引从0开始,所以最大合法索引是98),这肯定会触发越界错误。下面咱们看看代码里的具体问题,以及怎么修正:
问题分析
R矩阵尺寸不匹配
你调用R=reward(action,0,99)时,reward函数里用n=99初始化了R=np.zeros((n,2)),所以R是99行2列的矩阵,行索引只能到98。但后续循环for i in range(100,999,1)时,i-1等于99,这就超出了R的合法索引范围。变量名冲突导致逻辑混乱
reward函数的参数名是i,但函数内部循环又用了i作为循环变量,这会覆盖传入的参数值,导致循环范围不符合预期。循环范围遗漏元素
- 初始化前100个元素时,你用了
range(0,99,1),这只会给索引0到98的元素赋值,漏掉了索引99的元素; - 处理剩余元素时,
range(100,999,1)只会处理到索引998,漏掉了最后一个元素(索引999)。
- 初始化前100个元素时,你用了
reward函数的行对应关系错误
函数里的循环没有正确映射action索引到R的行索引,导致部分行没有被正确赋值。
修正后的代码
import numpy as np import random # 合并重复的导入语句 # 初始化1000个元素的action数组 action = np.zeros((1000)) # 重写reward函数:修改参数名避免冲突,明确行索引映射 def reward(action, start_idx, end_idx): # 根据要处理的action索引范围,确定R的行数 row_count = end_idx - start_idx + 1 R = np.zeros((row_count, 2)) # 遍历指定范围的action元素 for idx in range(start_idx, end_idx + 1): # 计算当前action元素在R中对应的行号 r_row = idx - start_idx if action[idx] == 1: R[r_row, 0] = 1 + action[idx]/2 else: R[r_row, 1] = 1 + action[idx]/2 return R # 初始化前100个元素(索引0到99,共100个) random.seed(771) for i in range(0, 100): # 注意:randint(1,3)才会生成1或2,原代码的randint(1,2)只会生成1 action[i] = random.randint(1, 3) print("前100个action元素:", action[0:100]) # 生成对应action[0]到action[99]的R矩阵(100行) R = reward(action, 0, 99) print("初始R矩阵:", R) # 处理剩余的900个元素(索引100到999) for i in range(100, 1000): # 访问R中对应action[i-1]的行(因为R对应0-99,所以i-1直接对应R的索引) if R[i-1, 0] > R[i-1, 1]: action[i] = 1 else: action[i] = 2 # 生成对应action[100]到action[999]的R矩阵 R_remaining = reward(action, 100, 999) print("剩余部分的R矩阵:", R_remaining)
额外说明
- 关于
random.randint:原代码里的random.randint(1,2)是左闭右开区间,只会生成1;如果需要随机生成1或2,要改成random.randint(1,3)。 - R矩阵的索引映射:现在
reward函数里,action[idx]对应的R行是idx - start_idx,确保每个action元素都能正确对应到R的一行,不会出现索引错位。
内容的提问来源于stack exchange,提问作者Rawia Sammout
相关产品推荐
相关产品推荐

