【发布时间】:2011-05-20 07:13:01
【问题描述】:
我正在使用以下代码将数组数字化为 16 个 bin:
numpy.digitize(array, bins=numpy.histogram(array, bins=16)[1])
我希望输出在 [1, 16] 范围内,因为有 16 个 bin。但是,返回的数组中的值之一是 17。这如何解释?
【问题讨论】:
标签: python statistics numpy binning
我正在使用以下代码将数组数字化为 16 个 bin:
numpy.digitize(array, bins=numpy.histogram(array, bins=16)[1])
我希望输出在 [1, 16] 范围内,因为有 16 个 bin。但是,返回的数组中的值之一是 17。这如何解释?
【问题讨论】:
标签: python statistics numpy binning
在 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)
数组([1, 2, 3, 4, 4])
【讨论】:
这实际上是numpy.digitize() 的记录行为:
返回的每个索引
i是这样的bins[i-1] <= x < bins[i]如果bins是单调递增的,或者bins[i-1] > x >= bins[i]如果bins单调递减。如果x中的值超出bins、0或len(bins)的边界将酌情返回。
因此,在您的情况下,0 和 17 也是有效的返回值(请注意,numpy.histogram() 返回的 bin 数组的长度为 17)。 numpy.histogram() 返回的 bin 覆盖范围 array.min() 到 array.max()。文档中给出的条件显示 array.min() 属于第一个 bin,而 array.max() 位于最后一个 bin 之外——这就是为什么 0 不在输出中,而 17 在输出中。
【讨论】:
array.min() 应该位于第一个 bin 中,因为它满足 bins[0] <= array.min() < bins[1] 条件,但 array.max() 不满足 bins[15] <= array.max() < bins[16],所以它不在最后一个垃圾箱。
numpy.histogram 的 bins 参数的行为不同(最后一个区间是闭区间),导致混淆。
numpy.histogram() 产生一个 bin edges 数组,其中有 (number of bins)+1。
【讨论】: