Нахождение смежных областей фиксированной длины массива с нанонаполнением (без перекрытия) - PullRequest
1 голос
/ 02 октября 2019

Я нашел похожие вопросы, опубликованные здесь, но ни один из них не относится к определенным строкам временных рядов. Я ожидаю, что решение может быть найдено через NumPy или Scipi. Поскольку у меня так много данных, я бы предпочел не использовать рамки данных панд.

У меня много прогонов 19-канальных данных ЭЭГ, хранящихся в двумерных массивах. Я прошел и пометил зашумленные данные как nan, поэтому данный прогон может выглядеть примерно так:

C1  C2  C3  C4  C5  C6  C7  C8  C9  C10  C11  C12  C13  C14  C15  C16  C17  C18  C19
nan 7   5   4   nan nan 7   9   0   -3   nan  2    nan  nan  5    7    6    nan  8
0   6   7   3   5   9   2   2   4   6    8    7    5    6    4    -1   nan  -8   -9
6   8   7   7   0   3   2   4   5   1    3    7    3    8    4    6    9    0    0
...
nan nan nan 3   5   -1  0   nan nan nan  1    2    0    -1   -2   nan  nan  nan  nan

(без меток канала)

Каждый прогон содержит от 80 000 до 120 000 строк (циклов) длинный.

Для каждого из этих прогонов я хочу создать новый стек смежных непересекающихся эпох, где никакие значения не подвергались артефактам для nan. Примерно так:

def generate_contigs(run, length):
   contigs = np.ndarray(three-dimensional array of arbitrary depth x 19 x length)
   count = 0
   for row in run:
      if nan not in row:
         count+=1
         if count==length:
            stack array of last (length) rows on contigs ndarray
            count = 0
      else:
         count = 0
   return(contigs)

Скажем, например, что я указал длину 4 (произвольно малую) и что моя функция нашла 9 непересекающихся контигов, где значение для 4 прямых строк не было nan.

Мой вывод должен выглядеть примерно так:

contigs = [
[19x4 array],
[19x4 array],
[19x4 array],
[19x4 array],
[19x4 array],
[19x4 array],
[19x4 array],
[19x4 array],
[19x4 array]
]

Где каждый элемент в стеке вывода похож на следующее:

[4 6 5 8 3 5 4 1 8 8 7 5 6 4 3 5 6 6 5]  
[5 5 7 2 2 9 8 7 7 8 3 0 7 4 4 6 3 7 3]  
[4 4 6 7 9 0 9 9 8 8 7 7 6 6 5 5 4 4 3]  
[1 2 3 4 5 4 3 6 5 4 3 7 6 5 8 7 6 9 8]

Где 4 строки, содержащиеся в этом элементе, были найдены непрерывнов массиве данных исходного прогона.

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

1 Ответ

0 голосов
/ 02 октября 2019

Вы можете использовать параметры индексирования numpy , чтобы пролистать массив и посмотреть, содержит ли какой-либо выбор с подходящим размером длины x 19 какое-либо значение nan, используя numpy isnan и numpy any .
Если значения nan нет, добавьте выделение в список contigs и перейдите после него, если вместо nan переместите индекс на 1 и проверьте, если новыйвыбор свободен nan.
В пути легко сохранить индексы первого ряда сгруппированного выбора.

def generate_contigs(run, length):
    i = 0
    contigs = []
    startindexes = []
    while i < run.shape[0]-length:
        stk = run[i:(i+length),:]
        if not np.any(np.isnan(stk)):
            contigs.append(stk)
            startindexes.append(i)
            i += length
        else:
            i += 1
    return contigs, startindexes
...