【问题标题】: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.0 到5.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 将是您的直方图的数字表示。