Найти все локальные Maxima и Minima, когда значения x и y заданы как numpy массивы

У меня два массива x и y :

 x = np.array([6, 3, 5, 2, 1, 4, 9, 7, 8]) y = np.array([2, 1, 3, 5, 3, 9, 8, 10, 7]) 

Я нахожу индекс локальных минимумов и максимумов следующим образом:

  • scipy.misc.derivative для функции множественного аргумента
  •  sortId = np.argsort(x) x = x[sortId] y = y[sortId] minm = np.array([]) maxm = np.array([]) while i < y.size-1: while(y[i+1] >= y[i]): i = i + 1 maxm = np.insert(maxm, 0, i) i++ while(y[i+1] <= y[i]): i = i + 1 minm = np.insert(minm, 0, i) i++ 

    В чем проблема в этом коде? Ответ должен быть индексом minima = [2, 5, 7] и значением maxima = [1, 3, 6] .

  • Matplotlib: даты форматирования по оси x в 3D-гистограмме
  • Производительность numpy.searchsorted плоха на структурированных массивах
  • данные биннинга в python с scipy / numpy
  • как объяснить дерево решений из scikit-learn
  • Визуализация 3D-numpy-массива кадр за кадром
  • От ND до 1D массивов
  • 3 Solutions collect form web for “Найти все локальные Maxima и Minima, когда значения x и y заданы как numpy массивы”

    Вы не нуждаетесь в этом while цикла. В приведенном ниже коде вы получите нужный результат; он находит все локальные минимумы и все локальные максимумы и сохраняет их в minm и maxm соответственно. Обратите внимание: когда вы применяете это к большим наборам данных, сначала сверките сигналы; иначе вы получите массу экстремумов.

     import numpy as np from scipy.signal import argrelextrema import matplotlib.pyplot as plt x = np.array([6, 3, 5, 2, 1, 4, 9, 7, 8]) y = np.array([2, 1, 3 ,5 ,3 ,9 ,8, 10, 7]) # sort the data in x and use that to rearrange y sortId = np.argsort(x) x = x[sortId] y = y[sortId] # this way the x-axis corresponds to the index of x plt.plot(x-1, y) plt.show() maxm = argrelextrema(y, np.greater) # (array([1, 3, 6]),) minm = argrelextrema(y, np.less) # (array([2, 5, 7]),) 

    Это должно быть гораздо более эффективным, чем выше, чем цикл while.

    Сюжет выглядит так: Я переместил значения x так, чтобы они соответствовали возвращаемым индексам в minm и maxm ):

    введите описание изображения здесь

     x=np.array([6,3,5,2,1,4,9,7,8]) y=np.array([2,1,3,5,7,9,8,10,7]) sort_idx = np.argsort(x) y=y[sort_idx] x=x[sort_idx] minm=np.array([],dtype=int) maxm=np.array([],dtype=int) length = y.size i=0 while i < length-1: if i < length - 1: while i < length-1 and y[i+1] >= y[i]: i+=1 if i != 0 and i < length-1: maxm = np.append(maxm,i) i+=1 if i < length - 1: while i < length-1 and y[i+1] <= y[i]: i+=1 if i < length-1: minm = np.append(minm,i) i+=1 print minm print maxm 

    minm и maxm содержат индексы минимумов и максимумов соответственно.

    Это будет работать нормально.

    Python использует += вместо ++ .

    Прежде чем использовать i в цикле while, вам нужно назначить некоторое значение – в этом случае 0 -, таким образом инициализируя его, чтобы избежать ошибки.

     import numpy as np x=np.array([6,3,5,2,1,4,9,7,8]) y=np.array([2,1,3,5,3,9,8,10,7]) sortId=np.argsort(x) x=x[sortId] y=y[sortId] minm = np.array([]) maxm = np.array([]) i = 0 while i < y.size-1: while(y[i+1] >= y[i]): i+=1 maxm=np.insert(maxm,0,i) i+=1 while(y[i+1] <= y[i]): i+=1 minm=np.insert(minm,0,i) i+=1 print minm, maxm 
    Python - лучший язык программирования в мире.