numpy.digitize 返回超出范围的值?

8 投票
4 回答
6101 浏览
提问于 2025-04-16 08:02

我正在使用以下代码将一个数组分成16个小区间:

numpy.digitize(array, bins=numpy.histogram(array, bins=16)[1])

我原本以为输出的结果应该在1到16之间,因为我有16个小区间。但是,返回的数组中有一个值是17。这是怎么回事呢?

4 个回答

2

在numpy 1.8版本中,你可以选择numpy.digitize这个函数是把区间看作闭合的还是开放的。

下面是一个例子(复制自 http://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html

x = np.array([1.2, 10.0, 12.4, 15.5, 20.])

bins = np.array([0,5,10,15,20])

np.digitize(x,bins,right=True)

结果是 array([1, 2, 3, 4, 4])

2

numpy.histogram() 这个函数会生成一个数组,这个数组包含了每个“箱子”的边界。箱子的数量加起来会有 (箱子的数量)+1 个边界。

10

这其实是 numpy.digitize() 的正常行为,文档里有说明:

返回的每个索引 i 都是这样的:如果 bins 是单调递增的,那么 bins[i-1] <= x < bins[i];如果 bins 是单调递减的,那么 bins[i-1] > x >= bins[i]。如果 x 的值超出了 bins 的范围,就会返回 0len(bins),具体取决于情况。

所以在你的例子中,017 也是有效的返回值(注意,numpy.histogram() 返回的 bin 数组长度是 17)。numpy.histogram() 返回的 bins 覆盖了从 array.min()array.max() 的范围。文档中给出的条件表明,array.min() 属于第一个 bin,而 array.max() 在最后一个 bin 之外——这就是为什么 0 不在输出中,而 17 在的原因。

撰写回答