2016-10-22 101 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 
相关问题