Принимая во внимание нудистый ндаррэй, как найти все пики, но каждый пик должен быть, по крайней мере, на некотором фиксированном расстоянии от других. Причина в том, что часто есть один пик, а затем следующие множество пиков являются просто соседними точками первого пика, поэтому они не являются какими-либо «новыми» пиками.
Я уверен, что должны быть лучшие реализации, и это то, что я прошу.
Чтобы проиллюстрировать, что я хотел бы, вот пример того, что я только что скомбинировал (я отредактировал, чтобы улучшить пример, и добавил изображение в конце):
import numpy as np
from matplotlib import pyplot as plt
import scipy as sp
import scipy.ndimage
def findpeaks(objective, maxpeaks=10, gap=0):
obj = objective.copy()
peaks = np.zeros([maxpeaks, 2], dtype=int)
for n in range(maxpeaks):
peak = np.unravel_index(np.argmax(obj, axis=None), obj.shape)
peaks[n,:] = peak
obj[np.maximum(0,peak[0]-gap):np.minimum(40,peak[0]+gap),
np.maximum(0,peak[1]-gap):np.minimum(40,peak[1]+gap)] = 0
return peaks
np.random.seed(12345)
x = np.random.uniform(0, 1, [40,40])
x = sp.ndimage.filters.gaussian_filter(x, [3,3], mode='constant')
peaks = findpeaks(x, 10, 5)
print(peaks.T)
print(x[peaks[:,0],peaks[:,1]])
print(np.array(np.unravel_index(x.flatten().argsort()[-10:][::-1],x.shape)))
for p in peaks:
x[p[0]-1:p[0]+2,p[1]]=0
x[p[0],p[1]-1:p[1]+2]=0
plt.imshow(x, cmap='gray')
Выход
[[27 11 26 24 5 16 25 16 13 31]
[11 14 16 5 13 34 21 14 8 16]]
[0.55472915 0.54961331 0.53829221 0.5353206 0.53512158 0.52064241
0.51729225 0.51557288 0.51025817 0.50846277]
[[27 27 26 28 27 28 26 27 26 11]
[11 12 11 11 10 12 12 13 10 14]]
Он принимает случайный массив x
и применяет гауссов фильтр, чтобы сделать его гладким. Именно из-за этой гладкости, как только вы найдете один максимум, остальные, как правило, будут его соседями.
Метод findpeaks
находит разделенные пики. Расположение этих пиков - первые две строки в выводе.
Две средние строки - это значения максимумов 10.
Последние две строки - это местоположения самых больших точек с использованием среза. Как видно, вы просто получаете несколько смежных точек.