`numpy`直方图和数字化用于分箱

时间:2017-01-23 18:26:16

标签: python arrays numpy

常规设置

通常在分类或数据分析中,我想" lump"类别在一起。例如,如果用户能够在值1到6之间陈述他们的偏好,我可能想要将[1, 2], [3, 4], [5, 6]混为一谈。

在我看来,numpy.digitize()numpy.histogram()的自然延伸,应该让我有能力执行上面提到的内容。

例如,让我们创建一个包含偶数个整数的随机数组:

In [337]: arr = numpy.random.randint(low=0, high=6, size=100)
In [340]: numpy.unique(arr)
Out[340]: array([0, 1, 2, 3, 4, 5])

numpy.historgram(bins=3)按预期执行,创建以下容器和适当的映射。

In [338]: freq, bins = numpy.histogram(arr, bins=3)
In [339]: print(bins)

Out[339]:
array([ 0.        ,  1.66666667,  3.33333333,  5.      ]))

应该注意according the numpy.histogram(),间隔是

这按照预期进行映射,其中来自文档:

  

备注

     

除了最后一个(最右边)的垃圾箱以外的所有垃圾箱都是半开的。换一种说法,   如果bins是::

     

[1,2,3,4]

     

然后第一个bin是[1, 2)(包括1,但不包括2)和   第二个[2, 3)。但是,最后一个bin是[3, 4]   包含 4。

  • [0, 1] ==> 1
  • [2, 3] ==> 2
  • [4, 5] ==> 3

" Gotcha"来自numpy.digitize()

如果我们遵循numpy.histogram用来构建其垃圾箱的相同逻辑,那么 函数numpy.digitize(arr, bins=bins)应该无缝地使我们达到预期的结果, 并使用与创建箱子相同的逻辑来实现。 然而,正在运行 以下代码产生了一个奇怪的结果:

In [340]: bind_arr = numpy.digitize(
                      arr, bins=bins)
In [341]: print(numpy.unique(bind_arr))
Out[347]: array([1, 2, 3, 4])

发生的事情是numpy.digitize假设bin[i - 1] <= x < bin[i],意思是 5.构建中包含的bin现在已排除(并且已经拥有自己的bin)

我使用的简单黑客一直是:

In [348]: tol = .0001
In [349]: bins[-1] += tol

现在numpy.digitize()函数按预期工作,下面的函数提供了预期的结果:

In [358]: bind_arr2 = numpy.digitize(arr, bins=bins)
In [359]: print(numpy.unique(bind_arr2))
Out[359]: array([1, 2, 3])

我的问题:是否有一种直接的方式来执行我上面列出的(普通)操作 增加最后的垃圾箱?这似乎是不一致的逻辑,不是吗?最后,这种类型的逻辑是否足够有效(在人们的意见中)我应该发出拉取请求以将功能添加到numpy.digitize()

0 个答案:

没有答案