Идентификация непрерывно повторяющихся массивов подпоследовательностей - PullRequest
0 голосов
/ 13 декабря 2018

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

>>> np.repeat([1,2,3,4],6)
array([1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
       4, 4])

Но на самом деле это выглядит примерно так из-за шума, поврежденных датчиков или чего-либо еще:

array([6, 1, 1, 6, 1, 2, 2, 4, 2, 2, 2, 3, 3, 3, 3, 3, 8, 4, 4, 6, 4, 4])

значения были пропущены или неправильно зарегистрированы.

Теперь я хочу:

  1. Найти количество смежных последовательностей и их идентификатор (под этим я подразумеваю, например, что 1,1,1,1,1,1 - это последовательность длиной шесть со всеми значениями 1).
  2. Все смежные последовательности должны иметь одинаковую длину, но из-за шума и поврежденных данных они могут отсутствовать в данных.Я также хочу найти длину смежной последовательности.
  3. Наконец, на высоком уровне я хочу быть в состоянии сказать, имеет ли последовательность, которую я передаю своей функции, эту структуру (повторяющуюся непрерывную последовательность) - в основном какой-то тест, который возвращает True илиFalse в зависимости от характера последовательности.

1 Ответ

0 голосов
/ 23 января 2019

Вы можете использовать medfilt из scipy signal module

from scipy import signal
import numpy as np
import matplotlib.pyplot as plt

org = np.array([6, 1, 1, 6, 1, 2, 2, 4, 2, 2, 2, 3, 3, 3, 3, 3, 8, 4, 4, 6, 4, 4])

filt = signal.medfilt(org)

plt.plot(range(len(org)), org, label='orgiginal')
plt.plot(range(len(filt)), filt, label='filtered')
plt.legend()

print(filt)

sub_arrays = np.split(filt, np.where(np.diff(filt))[0]+1)
print(sub_arrays)
number_contiguous_sequences = len(sub_arrays)

for array in sub_arrays:
    print(len(array)) # gives 4, 7, 5, 6

Filt:

[1. 1. 1. 1. 2. 2. 2. 2. 2. 2. 2. 3. 3. 3. 3. 3. 4. 4. 4. 4. 4. 4.]

sub_arrays:

[array([1., 1., 1., 1.]), array([2., 2., 2., 2., 2., 2., 2.]), array([3., 3., 3., 3., 3.]), array([4., 4., 4., 4., 4., 4.])]

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...