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

为何NumPy直方图最后一个区间计数异常偏高?

问题描述

测试脚本

import numpy as np

a = np.random.randint(0, 256, (500, 500)).astype(np.uint8)
counts, bins = np.histogram(a, range(0, 255, 25))
print(np.column_stack((counts, bins[:-1], bins[1:])))  
counts, bins = np.histogram(a, range(0, 257, 16))
print(np.column_stack((counts, bins[:-1], bins[1:])))  

执行输出

[[24721     0    25]
 [24287    25    50]
 [24413    50    75]
 [24441    75   100]
 [24664   100   125]
 [24390   125   150]
 [24488   150   175]
 [24355   175   200]
 [24167   200   225]
 [25282   225   250]]
[[15800     0    16]
 [15691    16    32]
 [15640    32    48]
 [15514    48    64]
 [15732    64    80]
 [15506    80    96]
 [15823    96   112]
 [15724   112   128]
 [15629   128   144]
 [15681   144   160]
 [15661   160   176]
 [15558   176   192]
 [15526   192   208]
 [15469   208   224]
 [15772   224   240]
 [15274   240   256]]

疑问

第一个直方图的[225, 250]区间计数始终最高,而第二个直方图呈现预期的均匀分布。多次测试均出现此现象,恳请解释原因。


问题原因解释

核心原因是第一个直方图的最后一个区间包含的数值数量比其他区间多1个,导致计数始终偏高,具体拆解如下:

  • 数值分布基础:np.random.randint(0,256, (500,500))生成0~255(含)的均匀分布整数,共256个不同取值,总元素数为250000。
  • 第一个直方图的bins逻辑:
    • range(0,255,25)生成的边界数组为[0,25,50,...,225,250];
    • NumPy的histogram规则:除最后一个区间外,其余均为左闭右开(如[0,25)包含024共25个数值),最后一个区间为闭区间`[225,250]`,包含225250共26个数值(比其他区间多1个);
    • 均匀分布下,包含更多数值的区间计数自然更高:26个数值的区间预期计数约为250000*(26/256)≈25391,与输出的25282吻合;其他区间预期计数约为250000*(25/256)≈24414,也和输出一致。
  • 第二个直方图的bins逻辑:
    • range(0,257,16)生成的边界数组为[0,16,...,240,256];
    • 所有区间(包括最后一个闭区间[240,256])都包含16个数值(如[240,256]对应240~255),因此计数呈现均匀分布。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:35:03