当weights参数是整数时,如何从numpy.bincount获取整数数组

时间:2017-06-13 22:24:49

标签: python numpy

考虑numpy数组a

a = np.array([1, 0, 2, 1, 1])

如果我进行bin计数,我会得到整数

np.bincount(a)

array([1, 3, 1])

但是,如果我添加权重来执行等效的bin计数

np.bincount(a, np.ones_like(a))

array([ 1.,  3.,  1.])

相同的值,但float。将这些操纵到int的最明智的方法是什么? numpy为什么不假设与作为权重传递的dtype相同?

1 个答案:

答案 0 :(得分:3)

  

为什么numpy不会假设与作为权重传递的dtype相同?

有两个原因:

  • 有几种方法可以对计数进行加权,方法是将值乘以权重,或者将值乘以权重除以权重之和。在后一种情况下,它总是双倍的(因为否则划分将是不准确的)。

    根据我的经验,使用标准化权重(第二种情况)进行加权更为常见。因此,假设它们是浮点数,实际上是合理的(并且肯定更快)。

  • 溢出。计数超过整数限制是不可能的,因为数组的值不能超过此限制(原因是这样,否则您无法索引数组)。但如果你将它与权重相乘,就不难使计数“溢出”。

我想在这种情况下可能是后一个原因。

不太可能有人会使用非常大的整数权重和大量重复值 - 但只是假设如果会发生什么:

# Makefile example
..
CFLAGS += -DBUILD
..

将返回:

import numpy as np

i = 10000000
np.bincount(np.ones(100000000, dtype=int), weights=np.ones(10000000, dtype=int)*1000000000000)

而不是实际结果:

array([0, -8446744073709551616])

结合第一个原因以及将浮点数组转换为整数数组非常容易(我认为这很简单)的事实:

array([  0.00000000e+00,   1.00000000e+19])

可能np.asarray(np.bincount(...), dtype=int) 对加权float的“实际”返回的dtype进行了设置。

“文字”原因:

numpy source实际上提到bincount需要转换为weightsdouble):

float64

好吧,他们then just cast it to double在函数中。这就是为什么你得到浮动数据类型的结果的“字面”原因。