使用.npy文件绘制散点图时遇IndexError索引越界问题求助
问题分析与解决
错误原因
你遇到的IndexError是因为数组的第3个维度(axis=2)大小为2,仅包含索引0和1,但你尝试访问索引2。结合你描述的“3个各有2列的矩阵”,加载后的history_my_optimization数组形状应为(3, N, 2)(N为每个矩阵的行数),第三个维度对应矩阵的列,只有2列,没有第3列。
同时你的代码还有两处明显错误:
plt.scatter参数用法错误:scatter的前两个参数是x/y坐标,第三个参数若要指定标记大小/颜色,需用size=或c=关键字,不能直接传数组;plt.xlabel = ("delay(um)")是赋值错误,应调用plt.xlabel()方法,plt.ylabel同理。
修正后的代码
场景1:用前两个矩阵的列做坐标,第三个矩阵的值做标记颜色
假设你想用三个矩阵的对应数据绘制散点,其中前两个矩阵的指定行数据作为x/y坐标,第三个矩阵的对应值作为标记颜色,修正代码如下:
import numpy as np import matplotlib.pyplot as plt from RandomScan import iteration,i_sample # 加载数据并确认形状(调试用) history_my_optimization = np.load("history_optimization.npy") print("数组形状:", history_my_optimization.shape) # 提取合法索引的坐标与颜色值 x = history_my_optimization[iteration, i_sample, 0] y = history_my_optimization[iteration, i_sample, 1] # 取第三个矩阵的对应行第一列作为颜色依据 color_vals = history_my_optimization[2, i_sample, 0] # 绘制散点图,指定颜色参数 plt.scatter(x, y, c=color_vals, cmap='viridis') # 正确设置坐标轴标签 plt.xlabel("delay(um)") plt.ylabel("Energy(MeV)") # 添加颜色条说明 plt.colorbar(label="Third Matrix Value") plt.show()
场景2:分别绘制三个矩阵的散点
如果你需要将三个矩阵的两列数据分别作为三组散点绘制,代码如下:
import numpy as np import matplotlib.pyplot as plt from RandomScan import iteration,i_sample history_my_optimization = np.load("history_optimization.npy") # 遍历三个矩阵,逐个绘制散点 for mat_idx in range(3): x = history_my_optimization[mat_idx, :, 0] y = history_my_optimization[mat_idx, :, 1] plt.scatter(x, y, label=f"Matrix {mat_idx+1}") plt.xlabel("delay(um)") plt.ylabel("Energy(MeV)") plt.legend() plt.show()
关键注意事项
- 先打印
history_my_optimization.shape确认数组维度,确保索引逻辑正确; - 确认
iteration和i_sample的取值范围,避免出现其他索引越界错误; plt.scatter的参数需符合规范,不要随意传递无关键字的位置参数。
内容的提问来源于stack exchange,提问作者Paul K
相关产品推荐
相关产品推荐

