我需要创建一个浮点值的直方图,我想知道我究竟能做到这一点。这种天真的方法:
>>> 5.3/0.2
26.499999999999996
>>> 5.2/0.2
26.0
分割然后将它们存储在字典中的显然不起作用。round()
也不够好,因为我想要有大小为0.2
的桶。我可以制作大小为0.1
的水桶,然后将它们组合起来......任何人都可以建议这样做的优雅方式吗?
答案 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.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
将是直方图的数字表示。