Поиск наиболее выраженных локальных максимумов в столбце данных

Задача

В столбце данных y1 около 100 тысяч строк. найти локальные максимумы, которые удовлетворяют условию: элемент y1[i] больше каждого из n1 предыдущих и каждого из n2 последующих элементов. По итогу вывести все значения i для которых это условие выполняется. Отмечу, что максимумов может быть большое количество, обычно их не менее 4-7 штук.

Для варианта сравнения с одним предыдущим и одним последующим элементом (n1 = n2 = 1) проблем не возникло:

max_y = []
for i in range(1, len(y1)-1):
    if y1[i] > y1[i-1] and y1[i] > y1[i+1]:
        max_y.append(i)

Теперь как это масштабировать для n1 и n2 значений? Частный случай n1 = n2 = 100.


Ответы (2 шт):

Автор решения: Andrey

это можно сделать взяв "окно" размером n1+n2+1 и проведя им по массиву данных. Берем с элементы с 0 до n1+n2+1 и находим максимум на данном отрезке, делаем проверку элемента между n1 и n2 с максимумом если он равен максимуму выводим его (и так на каждом сдвиге окна).

Далее сдвигаем "окно" на единицу в право анализируя какое число мы исключаем и какое добавляем:

  1. Новое число больше максимуму -> оно становится максимумом
  2. Число которое убираем меньше максимума -> ничего не меняется
  3. Число которое убираем равно максимума -> пересчитываем максимум в новом диапазоне
→ Ссылка
Автор решения: CameL

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

a = [3,5,2,4,8,6,5,1,2,10,3,4,6]
n1 = 3
n2 = 3
for i in range(n1, len(a) - n2):
    if a[i] > (max(a[i - n1:i])) and a[i] > (max(a[i - i:n2])):
       print(a[i])

В моем списке два локальных максимума подходящих под условие 8 и 10. Как видим решение работает.

→ Ссылка