为何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
相关产品推荐
相关产品推荐

