Python中NumPy矩阵索引越界报错(index 4 out of bounds)求解
解决NumPy矩阵索引越界问题
错误原因分析
- A矩阵列索引越界:A是7行4列的矩阵(
shape=(7,4)),但原代码中j的循环范围是range(0, len(A.T)+2),len(A.T)为4(A转置后是4行7列),导致j会取到0-5,当j>=4时,A[u][j]访问的列索引超出A的列数(0-3),触发越界错误。 - CLU转置矩阵行索引越界:CLU是7行4列的矩阵,转置后
CLU.T是4行7列(shape=(4,7)),axis0的索引范围仅为0-3。但原代码中k的循环范围是range(0, len(CLU.T[0])-1),len(CLU.T[0])为7,导致k会取到0-5,当k>=4时,CLU.T[k]访问的行索引超出范围,触发越界错误。 - PR元素判断逻辑问题:PR是二维数组(
shape=(6,1)),PR[i]是类似['E']的一维数组,直接用PR[i] in CLU.T[k]无法正确判断字符串是否存在,需提取元素值(PR[i][0])再判断。 - 循环逻辑冗余:原代码
else分支每次循环都append 0,导致n的长度远超预期,后续reshape时会出现形状不匹配问题。
修正后的代码
import numpy as np A = np.array([ ['A','T','W','S'], ['H','R','W','Q'], ['P','E','Z','A'], ['Y','U','O','W'], ['T','I','P','V'], ['R','A','M','G'], ['V','K','J','F'] ]) PR = np.array([ ['E'],['R'],['A'],['M'],['K'],['L'] ]) CLU = np.array([ ['A','X','A','M'], ['R','D','S','L'], ['E','F','E','B'], ['T','J','R','R'], ['L','Y','G','A'], ['M','R','H','D'], ['P','T','N','C'] ]) n = [[] for _ in range(4)] m = np.zeros((6,4)) for i in range(len(PR)): # 遍历A的所有列(0-3) for j in range(A.shape[1]): # 遍历A的所有行(0-6,若原需求仅取前5行可改为range(5)) for u in range(A.shape[0]): # 遍历CLU转置后的所有行(0-3) for k in range(CLU.T.shape[0]): pr_val = PR[i][0] a_val = A[u][j] if pr_val in CLU.T[k] and a_val in CLU.T[k]: n[k].append(1) break else: n[k].append(0) n = np.array(n) N = n.T # 确保reshape的形状与元素总数匹配:6*7*4=168 z = N.reshape(6, 7, 4) for i in range(len(PR)): m[i] = np.sum(z[i], axis=0) print(m)
关键修改点
- 修正所有循环的索引范围,严格匹配矩阵的形状边界;
- 将PR的二维元素转为字符串值后再进行存在性判断;
- 使用
shape属性获取矩阵维度,避免依赖len导致的维度判断错误; - 确保
reshape时的形状与元素总数完全匹配,避免形状不匹配错误。
内容的提问来源于stack exchange,提问作者sahraoui khaoula
相关产品推荐
相关产品推荐

