Детектор пиков - обнаружение небольших пиков - PullRequest
0 голосов
/ 07 декабря 2018

Я прохожу через Детектор пиков Маркоса Дуарте и понимаю каждую строку, кроме той части, когда он обнаруживает небольшие пики ближе, чем минимальное расстояние между пиками:

if ind.size and mpd > 1:
        ind = ind[np.argsort(x[ind])][::-1]  # sort ind by peak height
        idel = np.zeros(ind.size, dtype=bool)
        for i in range(ind.size):
            if not idel[i]:
                # keep peaks with the same height if kpsh is True
                idel = idel | (ind >= ind[i] - mpd) & (ind <= ind[i] + mpd) \
                    & (x[ind[i]] > x[ind] if kpsh else True)
                idel[i] = 0  # Keep current peak
        # remove the small peaks and sort back the indices by their occurrence
        ind = np.sort(ind[~idel])

В частности,Я не понимаю эту строку:

idel = idel | (ind >= ind[i] - mpd) & (ind <= ind[i] + mpd) \
                        & (x[ind[i]] > x[ind] if kpsh else True)

Я понимаю, что он сортирует массив пиков (ind) по высоте пика и создает массив bool того же размера, инициализируя его ложными значениями.Затем он перебирает массив idel, проверяя сначала, является ли текущее значение 0 (false).

Я провел разные булевы сравнения следующей строки по отдельности, но не могу понять, как он использует mpd, так как он работает с ind как на уровне массива, так и на уровне элементов.Кто-нибудь может дать мне быстрое объяснение?Я застрял в этой точке.

Заранее спасибо!

1 Ответ

0 голосов
/ 07 декабря 2018

Напомним, что kpsh - это опция, которая переопределяет mpd.Обычно, если выбран mpd, вы можете видеть только один пик в любом данном сегменте длины 2*mpd.Однако, если выбрано kpsh, для пиков, имеющих одинаковую высоту, делается исключение, так как это ситуация связывания .

Теперь давайте проанализируем это:

(ind >= ind[i] - mpd) & (ind <= ind[i] + mpd) part проверяет элемент FOR EACH ind, находится ли он в mpd окрестности ind[i], поэтому он возвращает логический массив того же размера, что и ind.Я назову это arr_mpd.Предположим на секунду, что нет kpsh.Что произойдет, idel | arr_mpd вернет True для индексов i, где ind[i] уже имеет пик, определенный в его окрестности.Поэтому он отбрасывает ind[i], устанавливая idel[i] в TRUE, потому что позже, ind = np.sort(ind[~idel]) позаботится об их удалении.

Теперь давайте сосредоточимся на (x[ind[i]] > x[ind] if kpsh else True).Я собираюсь назвать это arr_kpsh.

  • Случай 1: kpsh==False делает arr_kpsh массивом True с.Поскольку операция bitwise_or выполняется с использованием &, arr_mpd & arr_kpsh сразу будет равен arr_mpd, поэтому arr_kpsh становится неэффективным, когда kpsh==False.
  • Случай 2: kpsh==True гдемагия случается.x[ind[i]] > x[ind] поэлементно проверяет, превышает ли значение пика, соответствующего ind[i], какие-либо другие индексы пика, найденные до этой точки.Если это так, то это означает, что это не одна и та же высота (нет необходимости проверять прямое равенство, поскольку пиковое значение может быть только больше).Если оно не больше, это означает, что есть еще один пик с той же высотой.Это переопределяет этот элемент от arr_mpd & arr_kpsh до False.Если этот элемент также ложен в idel alraedy, то он будет сохранен, сохраняя при этом те же высоты, когда kpsh=True.

Надеюсь, это поможет

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