使用Matplotlib绘制华夫图时遇索引越界错误求助
华夫图代码IndexError问题排查与修复
错误根源
数组索引顺序错误:
你创建的waffle数组形状是(waffle_hight, waffle_width)(即行数×列数),但赋值时用了waffle[row, col]——内层循环的row遍历的是waffle_width的范围,当waffle_width > waffle_hight时,row会超出数组第一维度(行数)的索引范围,直接触发IndexError: index X is out of bounds for axis 0 with size X。循环边界逻辑漏洞:
若waffle_hight * waffle_width不等于sum(tiles_per_category),category_index会持续递增到超过tiles_per_category的长度,后续访问该列表时会隐含越界风险,同时多余瓷砖无法分配到有效类别。
修复后的完整代码
import numpy as np tiles_per_category = [212, 334, 1500, 130] total_tiles = sum(tiles_per_category) # 自定义华夫图宽高,确保乘积等于总瓷砖数 waffle_hight = 20 waffle_width = total_tiles // waffle_hight waffle = np.zeros((waffle_hight, waffle_width)) category_index = 0 tile_index = 0 for row in range(waffle_hight): for col in range(waffle_width): tile_index += 1 # 切换类别的判断逻辑,添加边界防护 if tile_index > sum(tiles_per_category[:category_index]): if category_index < len(tiles_per_category): category_index += 1 # 修正数组索引顺序(行在前,列在后) waffle[row, col] = category_index - 1 # 让类别索引从0开始,匹配列表索引
核心修复说明
- 修正数组索引:严格遵循
numpy数组(行, 列)的访问顺序,避免索引越界。 - 强制总瓷砖数匹配:确保
waffle_hight * waffle_width等于类别瓷砖总和,防止category_index无限递增。 - 添加边界判断:限制
category_index不超过tiles_per_category的长度,彻底避免列表访问越界。 - 优化索引起始值:将类别索引改为从0开始,更符合Python的索引习惯,便于后续绘图时映射颜色或标签。
内容的提问来源于stack exchange,提问作者White_Dragon 1998
相关产品推荐
相关产品推荐

