考虑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相同?
答案 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
需要转换为weights
(double
):
float64
好吧,他们then just cast it to double在函数中。这就是为什么你得到浮动数据类型的结果的“字面”原因。