如何对plt.hist2d生成的2D直方图分箱并计算各箱元素数量
嘿,这问题我熟!其实plt.hist2d()已经帮你把每个箱的元素数量统计好了,咱们一步步来拆解:
第一步:正确接收
plt.hist2d()的返回值 你现在用bins = plt.hist2d(s1, s2, 100)把所有返回值塞进了一个变量里,但其实这个函数会返回4个关键内容,咱们应该把它们拆解开,方便后续操作:
import matplotlib.pyplot as plt import numpy as np # 假设你的s1、s2是已有的数据数组 counts, xedges, yedges, img = plt.hist2d(s1, s2, 100)
这里的四个返回值分别是:
counts:二维数组,每个元素就是对应箱里的元素数量(也就是你要的“积分结果”,hist2d已经帮你统计好了,不用额外计算)xedges:x轴方向的箱边界数组,长度是101(因为100个箱需要101个边界)yedges:y轴方向的箱边界数组,长度同样是101img:绘图用的图像对象,暂时用不上
第二步:获取单个箱的元素数量
counts的形状是(100, 100)(因为你指定了100个箱,代表x、y方向各分100个),直接通过索引就能拿到对应箱的元素数:
counts[i][j]:表示x轴第i个箱、y轴第j个箱里的元素总数- 对应的x轴范围是
[xedges[i], xedges[i+1]],y轴范围是[yedges[j], yedges[j+1]]
第三步:遍历所有箱
如果要逐个处理每个箱,有几种简单的方式:
方式1:用np.ndenumerate同时获取索引和数量
这个方法最直观,能直接拿到每个箱的位置和对应的元素数:
for (i, j), count in np.ndenumerate(counts): # 拿到当前箱的边界范围 x_low, x_high = xedges[i], xedges[i+1] y_low, y_high = yedges[j], yedges[j+1] # 这里可以添加你对每个箱的处理逻辑 print(f"箱({i},{j}):x∈[{x_low:.2f}, {x_high:.2f}], y∈[{y_low:.2f}, {y_high:.2f}],元素数量:{int(count)}")
方式2:嵌套循环遍历索引
如果你习惯传统的嵌套循环写法,也可以这样:
# 遍历x方向的所有箱 for i in range(counts.shape[0]): # 遍历y方向的所有箱 for j in range(counts.shape[1]): count = counts[i][j] x_low, x_high = xedges[i], xedges[i+1] y_low, y_high = yedges[j], yedges[j+1] # 处理逻辑...
额外说明
你提到的“对每个箱进行积分”其实plt.hist2d()已经完成了——counts数组里的每个值就是该箱内包含的元素总数,本质就是对落在该区间内的样本进行计数统计,不需要再额外做积分计算啦。
内容的提问来源于stack exchange,提问作者XaBla
相关产品推荐
相关产品推荐

