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

如何让numpy.histogram生成无空值分箱?指定bins=5时存在空箱

解决numpy.histogram分箱出现空箱的问题

默认用bins=5时,numpy会按数据的等宽区间分箱——把数据的最大值到最小值直接劈成5份。如果你的数据分布不均匀(比如有一堆数据挤在某个区间,其他地方没数据),自然会出现空箱。要避免空箱,核心是基于数据分布来划分区间,而不是硬套等宽。

最直接的办法是用分位数分箱,让每个箱子里的样本数量大致相等,这样就不会有空箱。具体操作如下:

  1. 用np.quantile生成分箱边界
    比如要分5个箱,就需要6个分位点(从0%到100%,分成5段):

    import numpy as np
    
    # 你的目标数组
    arr = np.array([1,2,3,4,5,6,7,8,9,10, 100, 200, 300])
    # 生成5个箱子的边界(6个分位点)
    bins = np.quantile(arr, np.linspace(0, 1, 6))
    
  2. 用自定义的bins计算直方图
    把生成的bins传给numpy.histogram:

    counts, final_bins = np.histogram(arr, bins=bins)
    

    这时候counts里就不会有0值了——每个箱子都包含了约20%的样本。

特殊情况处理

如果你的数组里有大量重复值,可能会出现分位点重复的情况(比如多个分位点对应同一个数值),这时候可以先对数组去重后再计算分位数,或者手动调整边界:

# 去重后计算分位数
unique_arr = np.unique(arr)
bins = np.quantile(unique_arr, np.linspace(0, 1, 6))
# 确保边界是严格递增的
bins = np.unique(bins)
# 如果去重后bins数量不够5个箱,说明数据重复度过高,需要手动调整
if len(bins) < 6:
    bins = np.linspace(arr.min(), arr.max(), 6)

这种分箱方式完全贴合你的数据分布,从根源上避免了空箱问题,比硬套等宽分箱实用得多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:44:59