Вам вообще не нужен этот цикл 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 rearrange y accordingly
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
):
![введите здесь описание изображения](https://i.stack.imgur.com/FqTEe.png)
Начиная с SciPy версии 1.1, вы также можете использовать find_peaks а>:
from scipy.signal import find_peaks
peaks, _ = find_peaks(y)
# this way the x-axis corresponds to the index of x
plt.plot(x-1, y)
plt.plot(peaks, y[peaks], "x")
plt.show()
Это дает
![введите описание изображения здесь](https://i.stack.imgur.com/VeMdQ.png)
Приятно то, что теперь вы также можете легко установить минимальную высоту пика (например, 8):
peaks, _ = find_peaks(y, height=8)
# this way the x-axis corresponds to the index of x
plt.plot(x-1, y)
plt.plot(peaks, y[peaks], "x")
plt.show()
![введите описание изображения здесь](https://i.stack.imgur.com/bhDVp.png)
Обратите внимание, что теперь исключается первый пик, так как его высота меньше 8.
Кроме того, вы также можете установить минимальное расстояние между пиками (например, 5):
peaks, _ = find_peaks(y, distance=5)
# this way the x-axis corresponds to the index of x
plt.plot(x-1, y)
plt.plot(peaks, y[peaks], "x")
plt.show()
![введите описание изображения здесь](https://i.stack.imgur.com/uaFhD.png)
Теперь средний пик исключен, так как его расстояние до двух других пиков меньше 5.
person
Cleb
schedule
26.06.2015
sortId=np.argsort(x); x=x[sortId]
? - person fferri   schedule 26.06.2015while
будет очень медленным (и я даже не говорю оnp.insert
, который в значительной степени перераспределяет массивыminm
/nmax
на каждой итерации). См. stackoverflow.com/questions/4624970/, чтобы правильно сделать это в numpy. - person rth   schedule 26.06.2015