2016-10-22 93 views
0

我試圖找到200個標籤的序列並返回它們的索引。這是我的第一次嘗試,但我確定必須有更好的方法(更快)...如何在列表中找到一系列值的索引?

序列必須是200的倍數,下一個序列小於200然後拒絕它。

This image shows what my code does at the moment with labels at the top and indexes on the bottom

對於信號處理問題。新的python。

indexs = [] 
zeros = [0]*200 
ones = [1]*200 
twos = [2]*200 
threes = [3]*200 
fours = [4]*200 
fives = [5]*200 
i=0 
while i < range(len(labels)): 

    if i+200 > len(labels): 
     break 

    if labels[i:i+len(zeros)] == zeros: 
     indexs.extend((range(i,i+len(zeros)))) 
     i+=200 
     continue 
    if labels[i:i+len(ones)] == ones: 
     indexs.extend((range(i,i+len(zeros)))) 
     i+=200 
     continue 
    if labels[i:i+len(twos)] == twos: 
     indexs.extend((range(i,i+len(zeros)))) 
     i+=200 
     continue 
    if labels[i:i+len(threes)] == threes: 
     indexs.extend((range(i,i+len(zeros)))) 
     i+=200 
     continue 
    if labels[i:i+len(fours)] == fours: 
     indexs.extend((range(i,i+len(zeros)))) 
     i+=200 
     continue 
    if labels[i:i+len(fives)] == fives: 
     indexs.extend((range(i,i+len(zeros)))) 
     i+=200 
     continue 
    i+=1 

編輯:

感謝所有反饋人來說是非常讚賞。我想我應該提一下,我正在處理大小爲1M +的數組,並且它們大部分都是200的塊。因此,我認爲while循環可以讓我跳過大部分循環。我的計劃的一部分是通過對這200個塊進行平均來降低維度,但也爲分類器創建了許多特徵。我在文件http://www.cis.fordham.edu/wisdm/includes/files/sensorKDD-2010.pdf中遵循類似的方法。

下面是類似(但規模較小)產生的數據

labels = [0]*1250+[1]*15400+[0]*12245+[5]*1204*[4]*20045  

EDIT2:繼承人一些更整潔的代碼採取一些你的建議的

def tensequencer(df): 
    labels = df.activity.as_matrix().tolist() 
    #find and store all indexs 
    indexs = [] 
    zeros = [0]*200 
    ones = [1]*200 
    twos = [2]*200 
    threes = [3]*200 
    fours = [4]*200 
    fives = [5]*200 
    numbers = [zeros, ones, twos, threes, fours, fives] 
    i=0 
    while i < range(len(labels)): 

     if i+200 > len(labels): 
      break 

     if labels[i:i+200] in numbers : 
      indexs.extend((range(i,i+len(zeros)))) 
      i+=200 
      continue 

     i+=1 


    #index dataframe 


    df = df.iloc[indexs,:] 
    df.index=range(df.shape[0]) 
    return df 
+0

好,每個'if'具有完全相同的內容,所以有在那裏可能是錯的。 – TigerhawkT3

+0

您在此代碼中沒有初始化**標籤**,也沒有產生任何輸出。不是我們可以重現的東西。 – Prune

回答

0

掃描通過標籤,跟蹤多長時間序列相同數字的結尾是當前值。只要該序列符合您的標準(即足夠長),將其添加到索引。

一個皺紋:說有一個400 3的運行。從您的描述中不清楚這是否應該算作200或400或兩者中的兩個序列。如果時間最長,那麼在運行結束之前不要決定是否添加索引。

0

你事先知道你多少次迭代需要:使用循環:

for i in range(len(labels) - 200): 

,消除您的休息聲明。

接下來,您有六組幾乎相同的檢查序列。將所有六個選項放入一個列表(列表)中,並且可以爲您的標籤檢查運行一個循環範圍(6)。

更好,你是否熟悉地圖減少?你可以做一個很好的單行檢查,詢問標籤[i + 1:i + 200]中的每個元素是否等於標籤[0]。這將消除六重檢查。

這讓你感動嗎?

0

我不會討論算法,只會調整代碼。 您可以使用集合來檢查200個元素的列表是否由單個重複元素組成。

for i in range(len(labels) - 200): 
    interval = labels[i:i+200] 
    reduced = set(interval) 
    if len(reduced) == 1: 
     repeated_number = reduced.pop() 

    # You have founded the number repeated 200 times consecutively. 
    # Now do whatever you wish with it. 
0

不知道這會更快的執行方面,但肯定會 更好的維護:

indexs = [] 
for i in range(len(labels)): 
    if i+200 > len(labels): 
     break 
    for j in range(0,6): 
     cset = [j] * 200 
     if labels[i:i+len(cset)] == cset: 
      indexs.extend((range(i,i+len(cset)))) 
      i += 200 
      break 
相關問題