【问题标题】:dividing floating points into buckets将浮点数划分为桶
【发布时间】:2014-08-13 19:15:47
【问题描述】:

我需要创建一个浮点值的直方图,我想知道我该怎么做。这种天真的方法:

>>> 5.3/0.2
26.499999999999996
>>> 5.2/0.2
26.0

划分然后将它们存储在字典中显然是行不通的。round() 也不够好,因为我想要大小为0.2 的桶。我可以制作大小为0.1 的水桶,然后将它们组合起来......有人可以提出一种优雅的方式吗?

【问题讨论】:

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


【解决方案1】:

使用 floored 除法获得正确的 bin 编号:

>>> 5.3//0.2
26.0

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

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

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

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

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

如 cmets 中所述,您可能还对numpy.histogram 感兴趣。

【讨论】:

    【解决方案2】:

    这取决于您拥有的 bin 数量以及您正在使用的值的范围。根据您问题中的代码,我假设您的值范围从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 将是您的直方图的数字表示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多