【问题标题】:numpy.digitize returns values out of range?numpy.digitize 返回值超出范围?
【发布时间】: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


    【解决方案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])

    【讨论】:

      【解决方案2】:

      这实际上是numpy.digitize() 的记录行为:

      返回的每个索引 i 是这样的 bins[i-1] <= x < bins[i] 如果 bins 是单调递增的,或者 bins[i-1] > x >= bins[i] 如果 bins 单调递减。如果x 中的值超出 bins0len(bins) 的边界将酌情返回。

      因此,在您的情况下,017 也是有效的返回值(请注意,numpy.histogram() 返回的 bin 数组的长度为 17)。 numpy.histogram() 返回的 bin 覆盖范围 array.min()array.max()。文档中给出的条件显示 array.min() 属于第一个 bin,而 array.max() 位于最后一个 bin 之外——这就是为什么 0 不在输出中,而 17 在输出中。

      【讨论】:

      • 嗯,我确实知道 digitize() 的边缘情况行为。但是,由于我使用 histogram() 来创建 bin,不是所有值都应该位于 bin 内吗?
      • 正如我在回答中解释的那样,array.min() 应该位于第一个 bin 中,因为它满足 bins[0] <= array.min() < bins[1] 条件,但 array.max() 不满足 bins[15] <= array.max() < bins[16],所以它不在最后一个垃圾箱。
      • 感谢您的耐心等待。 numpy.histogrambins 参数的行为不同(最后一个区间是闭区间),导致混淆。
      【解决方案3】:

      numpy.histogram() 产生一个 bin edges 数组,其中有 (number of bins)+1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        • 2018-03-31
        • 2021-07-05
        • 2016-04-24
        相关资源
        最近更新 更多