我在实时有效地分类数据方面完全迷失了方向。我想要做的是将一个给定的值分配给一个字典(或者如果有一个更有效的话,可以将其他结构分配)。
例如,如果我知道日期范围在0到100之间(或其他一些自定义边界)并且我有十个箱子所以bin 1包括0到10等,那么最好的实现方式是什么,这样我就可以简单将值放入数据结构中,它会自动知道放在哪里?
我看过here,但这就是你把所有数据放在一起的时候,而不是当它实时进入的时候。
我目前的设计很简单,可以循环识别它属于哪个篮子,但是当我有大量有100k循环的迭代传入数据点时,这个速度很慢。
答案 0 :(得分:2)
我认为bisect可能是您想要的,这是基于文档中的示例:
from bisect import bisect
d = {"A": 0, "B": 0, "C": 0, "D": 0, "E": 0, "F": 0}
def grade(score, breakpoints=[70, 80, 90, 100], grades='FBCDA'):
i = bisect(breakpoints, score)
return grades[i]
for n in [66, 67, 77, 88, 80, 90, 91,100]:
d[grade(n)] += n
print(d)
{'A': 100, 'C': 168, 'B': 77, 'E': 0, 'D': 181, 'F': 145}
答案 1 :(得分:1)
我写这篇文章说bin 0 = [Min:(Max-Min)/ Nbins)
class bins():
def __init__(self,Min,Max,Nbins):
self.bins = {}
self.Min=float(Min)
self.Max=float(Max)
self.Nbins=Nbins
for k in range(0,Nbins):
self.bins[k]=[]
def AddToMap(self,n):
if(n<self.Min or n>=self.Max):
print("Object out of map range. [ "+str(n)+" ]")
else:
k = int((n-self.Min)/((self.Max-self.Min)/float(self.Nbins)))
self.bins[k].append(n)
def prt(self):
for k in self.bins:
print self.bins[k]
b = bins(0,100,10)
b.AddToMap(1)
b.AddToMap(13)
b.AddToMap(21)
b.AddToMap(14)
b.AddToMap(13)
b.AddToMap(9)
b.AddToMap(11)
b.AddToMap(10)
b.AddToMap(0)
b.AddToMap(100)
b.AddToMap(42)
b.prt()
产生
Object out of map range. [ 100 ]
[1, 9, 0]
[13, 14, 13, 11, 10]
[21]
[]
[42]
[]
[]
[]
[]
[]