Python numpy处理txt数据报IndexError索引越界问题
问题描述
我正在对.txt文件中的数据进行清洗,共使用3份不同的.txt文件分别分析、清洗三类不同构念的数据。三份文件均包含10名受访者的作答数据,其中第一份与最后一份文件内每名受访者对应17条作答,中间文件内每名受访者对应16条作答。目前第一份、最后一份文件的处理代码可正常运行,但处理包含16道题的中间文件时出现索引报错,三段处理代码的逻辑几乎完全一致。
报错信息
Traceback (most recent call last): File "main.py", line 161, in <module> itemF = dataF[row,column] IndexError: index 16 is out of bounds for axis 1 with size 16
样本输入数据
['N.v.t.', '0', '1', '2', '1', 'N.v.t.', '0', '0', '2', '0', '0', '3', '2', '3', '1', '1'] ['N.v.t.', '1', 'N.v.t.', '0', '0', 'N.v.t.', '2', '0', 'N.v.t.', '1', '0', '1', '1', '2', '0', '1'] ['N.v.t.', '0', 'N.v.t.', '0', '0', 'N.v.t.', '0', '0', 'N.v.t.', '0', '0', '3', '0', '3', '0', '0'] ['2', '2', 'N.v.t.', '1', '3', '1', '2', '1', '1', '3', '2', '2', '3', '1', '2', '3'] ['1', '2', 'N.v.t.', '0', '0', 'N.v.t.', '2', '2', '0', '2', '1', '2', '2', '3', '1', '2'] ['N.v.t.', '0', 'N.v.t.', '1', '0', 'N.v.t.', '1', '2', 'N.v.t.', '1', '0', '3', '1', '3', '2', '2'] ['0', '3', 'N.v.t.', '0', '2', '3', '2', '1', '3', '2', '2', '2', '2', '3', '0', '1'] ['1', '3', 'N.v.t.', '0', '2', 'N.v.t.', '0', '2', 'N.v.t.', '0', '1', '1', '0', '2', '2', '1'] ['1', '2', '2', '2', '3', '3', '0', '2', '2', '2', '2', '2', '2', '2', '2', '1'] ['1', '2', 'N.v.t.', '0', '2', 'N.v.t.', '1', '3', '2', '2', '1', '3', '2', '2', '2', '2']
原始问题代码
import numpy dataF = numpy.loadtxt("answersFEAR.txt", dtype = str, delimiter = ", ") shapeF = dataF.shape (shapeF[0] == 5) print(dataF) for i in range(0, shape[0]): str1 = dataF[i, 0] str2 = dataF[i, -1] dataF[i, 0] = str1.replace('[', '') dataF[i, -1] = str2.replace(']', '') for column in range(0,shape[1]): for row in range(0, shape[0]): itemF = dataF[row,column] dataF[rij,kolom] = itemF.replace("'", '') dataF[dataF == 'N.v.t.'] = numpy.nan print("DATA FEAR") print(dataD) scoresF = dataF[:,1:17] scoresF = scoresF.astype(float) average_score_fear = numpy.nanmean(scoresF, axis = 1) print("") print("AVERAGE SCORE FEAR") print(average_score_fear)
预期输出效果(单条结果示例)
["['1'" "'2'" "'2'" "'2'" "'3'" "'3'" "'0'" "'2'" "'2'" "'2'" "'2'" "'2'" '2'" "'2'" "'2'" "'1']"] DATA FEAR [['1', '2', '2', '2', '3', '3', '0', '2', '2', '2', '2', '2', '2', '2', '2', '1']] AVERAGE SCORE FEAR
错误原因
- 核心索引越界问题:numpy数组切片遵循左闭右开规则,16题的中间文件加载后总列数为16,列索引范围是0-15。代码中硬编码切片
[:,1:17]会尝试访问索引为16的列,超出数组最大索引范围,触发报错。之前17题的文件总列数为17,最大索引是16,所以该切片不会越界,能正常运行。 - 多处变量名拼写错误:定义的数组形状变量为
shapeF,循环中错写为shape;替换单引号时赋值目标错写为未定义的rij,kolom,正确变量名应为row,column;打印清洗后数据时错把dataF写为dataD,这些拼写问题也会导致运行异常。 - 存在无效代码行:
(shapeF[0] == 5)没有绑定任何逻辑或赋值,且实际数据为10行,该判断无实际作用。
修复后代码
修复后代码不再硬编码列索引,可同时兼容16题、17题的文件,所有变量名拼写错误均已修正:
import numpy dataF = numpy.loadtxt("answersFEAR.txt", dtype = str, delimiter = ", ") shapeF = dataF.shape print(dataF) # 清理首尾的[]符号 for i in range(0, shapeF[0]): str1 = dataF[i, 0] str2 = dataF[i, -1] dataF[i, 0] = str1.replace('[', '') dataF[i, -1] = str2.replace(']', '') # 清理所有元素的单引号 for column in range(0, shapeF[1]): for row in range(0, shapeF[0]): itemF = dataF[row,column] dataF[row,column] = itemF.replace("'", '') # 替换缺失值 dataF[dataF == 'N.v.t.'] = numpy.nan print("DATA FEAR") print(dataF) # 取所有题目列(自动适配列数,不用硬编码数值) scoresF = dataF[:,1:shapeF[1]] scoresF = scoresF.astype(float) average_score_fear = numpy.nanmean(scoresF, axis = 1) print("") print("AVERAGE SCORE FEAR") print(average_score_fear)
内容的提问来源于stack exchange,提问作者Snek
相关产品推荐
相关产品推荐

