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

如何从二维直方图(2D Histogram)获取分箱计数及散点对应分箱坐标

嘿,我来帮你搞定获取散点分箱坐标和分箱计数的需求!先把你的示例代码补全,再一步步实现你要的功能:

完整实现方案

首先,我们先补全随机数据生成逻辑,再通过numpy.histogram2d获取二维直方图的核心信息——这是拿到分箱坐标和计数的关键:

import random
import matplotlib.pyplot as plt
import numpy as np

# 生成完整的随机XY数据集
x = [random.randrange(1, 100, 1) for _ in range(10000)]
y = [random.randrange(1, 100, 1) for _ in range(10000)]
x_np = np.array(x)
y_np = np.array(y)

# 自定义二维直方图的分箱数量(比如设置10x10的网格)
bin_num = 10

# 计算二维直方图:得到分箱计数、x轴分箱边界、y轴分箱边界
counts, x_bins, y_bins = np.histogram2d(x_np, y_np, bins=bin_num)

# --------------------------
# 1. 获取每个散点所在的分箱坐标
# --------------------------
# 用digitize找到每个散点对应的分箱索引(注意:digitize返回1-based索引,要减1转为0-based)
x_bin_indices = np.digitize(x_np, x_bins) - 1
# 修正边界值的索引越界问题:如果散点等于最大边界值,会被分到超出范围的索引,这里调整为最后一个分箱
x_bin_indices[x_bin_indices == bin_num] = bin_num - 1

y_bin_indices = np.digitize(y_np, y_bins) - 1
y_bin_indices[y_bin_indices == bin_num] = bin_num - 1

# 计算每个分箱的中心坐标(也可以按需取左下角/右上角,这里用中心做示例)
x_bin_centers = (x_bins[:-1] + x_bins[1:]) / 2
y_bin_centers = (y_bins[:-1] + y_bins[1:]) / 2

# 每个散点对应的分箱中心坐标
scatter_bin_x = x_bin_centers[x_bin_indices]
scatter_bin_y = y_bin_centers[y_bin_indices]

# --------------------------
# 2. 获取分箱计数(直接从counts数组提取)
# --------------------------
# counts是二维数组,counts[i][j]对应x第i个分箱、y第j个分箱的点数量
# 把分箱计数和每个散点绑定
scatter_bin_counts = counts[x_bin_indices, y_bin_indices]

# --------------------------
# 可视化验证:散点图+2D直方图网格+分箱高亮
# --------------------------
plt.figure(figsize=(10, 8))
# 绘制基础散点图
plt.scatter(x_np, y_np, s=5, alpha=0.3, label='原始散点')
# 叠加二维直方图网格
plt.hist2d(x_np, y_np, bins=bin_num, cmap='Blues', alpha=0.2)
# 高亮某个散点的分箱(比如第0个散点)
target_idx = 0
plt.scatter(scatter_bin_x[target_idx], scatter_bin_y[target_idx], s=100, c='red', marker='*', 
            label=f'第{target_idx}个散点的分箱中心\n该分箱计数:{scatter_bin_counts[target_idx]}')

plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.colorbar(label='分箱内点数量')
plt.show()

# 打印部分结果做验证
print("前5个散点的分箱信息:")
for i in range(5):
    print(f"散点{i}: 原始坐标({x_np[i]}, {y_np[i]}) → 分箱中心({scatter_bin_x[i]:.1f}, {scatter_bin_y[i]:.1f}),分箱计数:{scatter_bin_counts[i]}")

关键细节说明:

  • np.histogram2d返回的counts就是分箱计数的二维数组,x_bins和y_bins是分箱的边界值列表
  • np.digitize用来匹配散点和分箱的对应关系,一定要处理边界值的索引越界问题,避免报错
  • 分箱坐标可以根据需求调整:如果需要左下角坐标,直接取x_bins[:-1][x_bin_indices]和y_bins[:-1][y_bin_indices]即可

内容的提问来源于stack exchange,提问作者user9410826

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:55:00