将浮点划分为桶

时间:2014-08-13 19:15:47

标签: python python-3.x floating-point rounding

我需要创建一个浮点值的直方图,我想知道我究竟能做到这一点。这种天真的方法:

>>> 5.3/0.2
26.499999999999996
>>> 5.2/0.2
26.0
分割然后将它们存储在字典中的

显然不起作用。round()也不够好,因为我想要有大小为0.2的桶。我可以制作大小为0.1的水桶,然后将它们组合起来......任何人都可以建议这样做的优雅方式吗?

2 个答案:

答案 0 :(得分:4)

使用floored division获取正确的bin编号:

>>> 5.3//0.2
26.0

或者在真正旧版本的python上,您可以使用math.floor自己做同样的事情:

>>> math.floor(5.3 / 0.2)
26.0

通常,要计算箱号,您可以执行以下操作:

def get_bin(x, bin_width, start=0): 
    return (x - start) // bin_width

x是您的号码,start是第一个bin的下限。

如评论中所述,您可能也对numpy.histogram感兴趣。

答案 1 :(得分:1)

它取决于您拥有的垃圾箱数量以及您正在使用的值范围。根据您问题中的代码,我假设您的值的范围从0.05.3(或5.2?),并且您的每个分区都是0.2宽。

如果所有浮点数都存储在名为values的列表中,那么代码将如下所示:

import math

max_value = 5.3
min_value = 0.0
bin_width = 0.2
num_of_bins = math.ceil((max_value - min_value) / bin_width)
bins = [0] * num_of_bins
for value in values:
    bin_num = math.floor((value - min_value) / bin_width)  
    bins[bin_num] += 1

然后bins将是直方图的数字表示。