如何让numpy.histogram生成无空值分箱?指定bins=5时存在空箱
解决numpy.histogram分箱出现空箱的问题
默认用bins=5时,numpy会按数据的等宽区间分箱——把数据的最大值到最小值直接劈成5份。如果你的数据分布不均匀(比如有一堆数据挤在某个区间,其他地方没数据),自然会出现空箱。要避免空箱,核心是基于数据分布来划分区间,而不是硬套等宽。
最直接的办法是用分位数分箱,让每个箱子里的样本数量大致相等,这样就不会有空箱。具体操作如下:
用
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))用自定义的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
相关产品推荐
相关产品推荐

