我使用以下代码将数组数字化为 16 个容器:
numpy.digitize(array, bins=numpy.histogram(array, bins=16)[1])
我期望输出在 [1, 16] 范围内,因为有 16 个 bin。然而,返回数组中的一个值是 17。这该如何解释呢?
这实际上是
numpy.digitize()
的记录行为:
返回的每个索引
使得i
ifbins[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 则在输出中。
numpy.histogram()
生成 bin edges 的数组,其中有 (number of bins)+1
。
在 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 离散化数组的方法。 问题是,np.histogram_bin_edges(因此,np.histogram)和np.digitize在使用bin边缘的方式上不一致:前2个总是返回一个额外的边缘,无论你在np.digitize中使用什么正确的模式,它总是留下一个“异常值”类别。 所要做的是(假设边缘按升序出现)
bin_edges=np.histogram_bin_edges(arr,bins=4) #or any other source
if bin_edges[0] <= arr.min():
categorized_arr=np.digitize(arr,bins=bin_edges[1:],right=True)
elif bin_edges[-1] >= arr.max():
categorized_arr=np.digitize(arr,bins=bin_edges[:-1],right=False)