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

问题描述 投票:0回答:4

我使用以下代码将数组数字化为 16 个容器:

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

我期望输出在 [1, 16] 范围内,因为有 16 个 bin。然而,返回数组中的一个值是 17。这该如何解释呢?

python statistics numpy binning
4个回答
8
投票

这实际上是

numpy.digitize()
的记录行为:

返回的每个索引

i
使得
bins[i-1] <= x < bins[i]
if
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 则在输出中。


2
投票

numpy.histogram()
生成 bin edges 的数组,其中有
(number of bins)+1


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)

数组([1,2,3,4,4])


0
投票

好吧,我找到了一个用 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)
© www.soinside.com 2019 - 2024. All rights reserved.