You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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轴方向的箱边界数组,长度同样是101
  • img:绘图用的图像对象,暂时用不上
第二步:获取单个箱的元素数量

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:36:33