Получить относительные экстремумы из массива 1D NumPy - PullRequest
0 голосов
/ 27 января 2019

Я пишу код, который включает алгоритм поиска локальных максимальных / минимальных значений в массиве. Но мне не удалось найти нужную функцию.

Сначала я использовал argrelextrema в scipy.signal.

b = [6, 1, 3, 5, 5, 3, 1, 2, 2, 3, 2, 1, 1, 9, 10, 10, 9, 8, 7, 7, 13, 10]

scipy.signal.argrelextrema(np.array(b), np.greater)
scipy.signal.argrelextrema(np.array(b), np.greater_equal)
scipy.signal.argrelextrema(np.array(b), np.greater_equal, order=2)

Результат

(array([ 9, 20], dtype=int64),)
(array([ 0,  3,  4,  7,  9, 14, 15, 20], dtype=int64),)
(array([ 0,  3,  4,  9, 14, 15, 20], dtype=int64),)

Первый не поймал b[3] (или b[4]). Поэтому я изменил его на второй, используя np.greater_equal. Однако в этом случае первое значение b[0] также обрабатывается как локальный максимум, и значение 2 в b[7] включается. Используя третий, я мог бы выбросить b[7]. Но order=2 по-прежнему имеет проблему, когда данные похожи на [1, 3, 1, 4, 1] (он не может поймать 3)

Мой ожидаемый результат

[3(or 4), 9, 14(or 15), 20]

Я хочу поймать только одного из b[3], b[4] (то же значение). Я хочу, чтобы некоторые проблемы argrelextrema, о которых я говорил выше, были решены. Код ниже успешно выполнен.

scipy.signal.find_peaks(b)

результат [3, 9, 14, 20].

Код, который я пишу, обрабатывает пару локального максимума и локального минимума. Поэтому я хочу найти локальный минимум таким же образом. Есть ли какая-нибудь функция типа scipy.signal.find_peaks для поиска локального минимума?

1 Ответ

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

Вы можете просто применить find_peaks к отрицательной версии вашего массива:

from scipy.signal import find_peaks

min_idx = find_peaks([-x for x in b])

Еще удобнее при использовании массивов numpy:

import numpy as np
b = np.array(b)
min_idx = find_peaks(-b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...