如何理解索引错误(Index Error)?使用pretty_confusion_matrix库生成混淆矩阵时遇索引越界问题求助
解决
pretty_confusion_matrix的IndexError问题 我来帮你搞定这个报错——本质原因是混淆矩阵必须是方阵(行数和列数完全相等),但你的DataFrame是49行×36列,行和列维度不匹配,才导致库在访问对角线元素时抛出索引越界错误。
为什么会出现这个问题?
pp_matrix函数要求输入的DataFrame是标准的混淆矩阵格式:
- 行代表真实类别,列代表预测类别
- 行的类别集合必须和列的完全一致,也就是说行数必须等于列数
你的数据里行有49个类别,列却只有36个,当库遍历列索引去访问对应行的对角线元素(array_df[col][col])时,列的索引很快就超出了行的有效范围,直接触发了IndexError。
具体解决方案
1. 先明确你的类别集合
首先搞清楚:你是想保留所有49个真实类别,还是只保留列里有的36个预测类别?根据需求选下面的调整方式:
方式一:补全缺失的列(保留所有真实类别)
如果你的行是完整的真实类别列表,列只是少了部分类别,那就把缺失的列补上,用0填充计数:
# 获取所有真实类别(行索引) all_true_classes = df.index.tolist() # 获取现有预测类别(列名) existing_pred_classes = df.columns.tolist() # 找出列里缺失的类别 missing_classes = [cls for cls in all_true_classes if cls not in existing_pred_classes] # 给DataFrame添加这些缺失列,值设为0 for cls in missing_classes: df[cls] = 0 # 可选:把列的顺序调整得和行索引一致,更符合混淆矩阵规范 df = df[all_true_classes]
方式二:过滤多余的行(只保留预测类别对应的真实行)
如果那些不在列里的行类别是不需要的,直接过滤掉:
# 获取所有预测类别(列名) pred_classes = df.columns.tolist() # 只保留行索引在预测类别里的行 df = df[df.index.isin(pred_classes)]
2. 验证调整后的维度
调整完后,先检查一下DataFrame的形状:
print(df.shape)
输出必须是(N, N)的方阵格式,比如(49,49)或者(36,36),这才符合混淆矩阵的要求。
3. 重新运行函数
维度没问题后,再执行你的代码:
pp_matrix(df, cmap=cmap)
额外排查小技巧
如果调整后还是报错,可以检查这两点:
- 行索引或列名有没有重复的类别?重复项会导致库内部处理时维度异常
- 确认DataFrame里的数值都是整数(混淆矩阵是计数矩阵,必须是整数类型)
内容的提问来源于stack exchange,提问作者c_metaphorique
相关产品推荐
相关产品推荐

