2017-01-31 16 views
1

ПроблемаКак найти недопустимые значения в непрерывном сигнале?

У меня есть несколько массивов с плавающей точкой, где мне нужно, чтобы определить индексы, где значения замораживание, где массив имеет такое же значение за период.

Пример

x = np.linspace(0, 30, 1000) 
y1 = np.sin(x) 
y2 = np.sin(x) 
# Introduce some errors! 
y2[ (x>5)&(x<=8) ] = -0.2 
y2[ (x>15)&(x<=16) ] = -1 
y2[ (x>16)&(x<17) ] = 1 

y1 и y2 выглядеть следующим образом:

enter image description here

И я хочу знать, где эти горизонтальные линии.


Я попытался

  • Loop:

    error = np.zeros_like(y2) 
    for i in range(1,y2.shape[-1]-1): 
        if y2[i-1] == y2[i] == y2[i+1]: 
         error[i-1] = 1 
         error[i] = 1 
         error[i+1] = 1 
    

Конечно, я могу определить длину окна перед for ... Но он чувствует себя неуклюжим, как как только у меня есть несколько вложенных циклов, для разных столбцов и периодов.

  • np.diff → Проблема здесь в том, что иногда производная 0 само по себе. Кроме того, часто бывает, что сигнал изменяется очень медленно (температура), поэтому я снова проверяю смежные (нулевые) значения в цикле.

  • Я начал искать индексирование наподобие: y2[ where(y2==previous(y2) & y2 == next(y2) ], но пока этого не удалось. Это то, что я сейчас пытаюсь сделать, с pandas.DataFrame.

Я хотел бы иметь или индексы, где появляются горизонтальные линии, или, возможно, заменить их np.nan. Мне также нужно немного поиграть с шириной окна (в конце концов, скорее всего, будет около 10 значений).

Любые идеи?


Контекст

То, что я на самом деле есть это pandas.DataFrame с измерениями температуры, где я получаю значения с плавающей точкой вместе с отметками времени во время записи. Иногда ошибка, кажется, «замерзает» и дает прямую линию вместо измерений. Иногда это последнее измерение повторяется, иногда это просто случайное значение. Мне нужно знать, когда каждый датчик вышел из строя. Конечно, продолжительность сбоев различна каждый раз. Каждый сигнал составляет около 30 000 элементов.


Использование: python 3.5.2 numpy 1.11.1 pandas 0.18.1

+1

как о 'np.isclose (np.diff (y2), 0)'? это имеет параметр допуска 'rtol': https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.isclose.html – EdChum

+0

Ошибочные значения точно такие же,' isclose() ' бросит много ложных срабатываний. – Luis

+1

Не относится к вопросу, просто FYI: 'y2 [np.ma.masked_where ((x> 5) & (x <= 8), y2) .mask] = -0.2' можно упростить до' y2 [(x > 5) & (x <= 8)] = -0,2'. –

ответ

2

Не можете вы просто сделать что-то вроде

dy2 = np.r_[1, np.diff(y2).astype(bool).astype(int), 1] 
bnds = np.diff(dy2) 
starts = np.where(bnds == -1)[0] 
stops = np.where(bnds == 1)[0] + 1 
keep = stops >= starts + min_length 
starts = starts[keep] 
stops = stops[keep] 
+0

Да, хороший трюк с типами данных и 'diff'! Я упаковал его в функцию и уже использую его, спасибо! :) – Luis

+0

BTW, я добавил пару строк в конце (только для справки): 'error = np.zeros_like (array)' 'для a, b в zip (start, stops):' 'error [a : b] = 1' 'assert error.shape == array.shape' ' return error' – Luis

+1

Добро пожаловать. Кстати, вы проверили границы, точны? Я не был на 100% уверен. Моя догадка - это остановка, которая может быть одной точкой. –

 Смежные вопросы

  • Нет связанных вопросов^_^