numpy.digitize 返回超出范围的值?
我正在使用以下代码将一个数组分成16个小区间:
numpy.digitize(array, bins=numpy.histogram(array, bins=16)[1])
我原本以为输出的结果应该在1到16之间,因为我有16个小区间。但是,返回的数组中有一个值是17。这是怎么回事呢?
4 个回答
在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])
numpy.histogram()
这个函数会生成一个数组,这个数组包含了每个“箱子”的边界。箱子的数量加起来会有 (箱子的数量)+1
个边界。
这其实是 numpy.digitize()
的正常行为,文档里有说明:
返回的每个索引
i
都是这样的:如果bins
是单调递增的,那么bins[i-1] <= x < bins[i]
;如果bins
是单调递减的,那么bins[i-1] > x >= bins[i]
。如果x
的值超出了bins
的范围,就会返回0
或len(bins)
,具体取决于情况。
所以在你的例子中,0
和 17
也是有效的返回值(注意,numpy.histogram()
返回的 bin 数组长度是 17
)。numpy.histogram()
返回的 bins 覆盖了从 array.min()
到 array.max()
的范围。文档中给出的条件表明,array.min()
属于第一个 bin,而 array.max()
在最后一个 bin 之外——这就是为什么 0
不在输出中,而 17
在的原因。