2016-05-10 66 views
1

的陣列類別,按照創建一個從給定一組範圍的間隔

dates = [[1200, 1300], [1100, 1300], [1200, 1300], [1200, 1400], [1100, 1400]] 

我想以高效的方式的所有可能的時間間隔來提取,然後計數在每個間隔可用的範圍的數量。

對於例如所得到的可能的間隔的矩陣將是:

 [1100, 1200] [1200, 1300] [1300, 1400] 
0   0   1   0 
1   1   1   0 
2   0   1   0 
3   0   1   1 
4   1   1   1 

然後,通過柱的總和給出了在每個間隔

[1100, 1200] 2 
[1200, 1300] 5 
[1300, 1400] 2 
+0

在th如果有一個區間說''1100,1150]',我們是否創建一個新的範圍或您的問題需要使用固定的區間長度?在你的例子中,你有'interval_length = 100'。 – jtitusj

+0

@JohnTitusJungao不,它不需要固定的間隔長度。 \t 在存在區間[1100,1150]的情況下,我們應該具有區間[1100,1150]和[1150,1200] – saloua

回答

3

這裏是一個辦法讓你想numpy矩陣m,與布爾值:

def getOverlap(a, b): 
    return max(0, min(a[1], b[1]) - max(a[0], b[0])) 

nodes  = sorted(np.unique(np.array(dates).flatten())) 
intervals = zip(nodes[:-1], nodes[1:]) 
# [(1100, 1200), (1200, 1300), (1300, 1400)] 

m = np.array([[bool(getOverlap(i, d)) for d in dates] for i in intervals]) 

m.sum(axis=1) 
# array([2, 5, 2]) 

請注意,如果你想要的「矩陣」是一個pandasDataFrame,簡單地做:

pd.DataFrame(m.transpose().astype(int), columns=intervals) 

    (1100, 1200) (1200, 1300) (1300, 1400) 
0    0    1    0 
1    1    1    0 
2    0    1    0 
3    0    1    1 
4    1    1    1 
0

我按照這個範圍的數量方法在這裏。可以比這更緊湊。那是另一天!

c=[[1200, 1300], [1100, 1300], [1200, 1300], [1200, 1400], [1100, 1400]] 
print "string values", c 
uniquea={} 
new=[] 
for i in c: 
    j=str(i) 
    if j in new: 
     uniquea[j]+=1 
    else: 
     uniquea[j]=1 
     new.append(j) 

打印uniquea,新

相關問題