ПроблемаКак найти недопустимые значения в непрерывном сигнале?
У меня есть несколько массивов с плавающей точкой, где мне нужно, чтобы определить индексы, где значения замораживание, где массив имеет такое же значение за период.
Пример
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
выглядеть следующим образом:
И я хочу знать, где эти горизонтальные линии.
Я попытался
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
как о 'np.isclose (np.diff (y2), 0)'? это имеет параметр допуска 'rtol': https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.isclose.html – EdChum
Ошибочные значения точно такие же,' isclose() ' бросит много ложных срабатываний. – Luis
Не относится к вопросу, просто FYI: 'y2 [np.ma.masked_where ((x> 5) & (x <= 8), y2) .mask] = -0.2' можно упростить до' y2 [(x > 5) & (x <= 8)] = -0,2'. –