Я пытаюсь найти последовательности из 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
EDIT:
Спасибо за все отзывы людей, он высоко ценится. Я думаю, что я должен упомянуть, что я работаю с массивами размером 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: Heres некоторые аккуратнее код принимая некоторые из ваших советов
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
Ну, каждый 'if' имеет точно такое же содержание, так что может быть, что-то не так. – TigerhawkT3
Вы не инициализировали ** ярлыки ** в этом коде и не выдавали никакого вывода. Не то, что мы можем воспроизвести. – Prune