我的数据如下[0.1,0.2,1,5,100]等等...... 我想做的是计算
之间的项目数1-10
11-20
21-30
... and so on...
现在,我的代码非常混乱..
我所做的是映射
1-10 :=> 0
11-20:=> 1
..and on..
所以我定义了桶0,其中桶0的范围是1-10,桶1的范围是11-20,依此类推。
代码是:
for ele in data:
bucket_id = get_bucket_id(ele)
freq_dict[bucket_id] +=1
get_bucket_id
是一个很大的if else
代码..
有更好的方法吗?
答案 0 :(得分:7)
使用Counter
并使用整数除法计算存储桶。
from collections import Counter
freq = Counter()
for x in data:
freq[(x - 1) // 10] += 1
请注意,这会将小于1的值映射到-1
。在处理非严格正数据时,您实际上想要使用范围1-9,10-19等
答案 1 :(得分:4)
您可以使用numpy.histogram
,其中列出了数据中的元素出现在一组间隔(bins)中的频率。它返回每个bin中的计数和每个bin的最右边:
>>> import numpy as np
>>> data = [0.1,0.2,1,5,100]
>>> hist, bin_edges = np.histogram( data )
>>> hist
array([4, 0, 0, 0, 0, 0, 0, 0, 0, 1])
>>> bin_edges
array([ 0.1 , 10.09, 20.08, 30.07, 40.06, 50.05, 60.04,
70.03, 80.02, 90.01, 100. ])
答案 2 :(得分:1)
您可以使用len
和filter
:
c = []
for l, u in [(1, 10), (11, 20), (21, 30)]: # ...
c.append(len(filter(lambda x: l <= x <= u, values)))
答案 3 :(得分:1)
您可以在此处使用collections.Counter
和bisect
模块:
>>> from bisect import bisect_left
>>> lis = range(0, 101, 10)
>>> l = [0.1, 0.2, 1, 5, 100, 11]
>>> c = Counter(bisect_left(lis, item) for item in l)
>>> c
Counter({1: 4, 10: 1, 2: 1})
>>> [c[i] for i in xrange(1, 11)]
[4, 1, 0, 0, 0, 0, 0, 0, 0, 1]