Найти разделенные максимумы в NumPy - PullRequest
0 голосов
/ 29 мая 2019

Принимая во внимание нудистый ндаррэй, как найти все пики, но каждый пик должен быть, по крайней мере, на некотором фиксированном расстоянии от других. Причина в том, что часто есть один пик, а затем следующие множество пиков являются просто соседними точками первого пика, поэтому они не являются какими-либо «новыми» пиками.

Я уверен, что должны быть лучшие реализации, и это то, что я прошу. Чтобы проиллюстрировать, что я хотел бы, вот пример того, что я только что скомбинировал (я отредактировал, чтобы улучшить пример, и добавил изображение в конце):

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]]

The x array and its maxima

Он принимает случайный массив x и применяет гауссов фильтр, чтобы сделать его гладким. Именно из-за этой гладкости, как только вы найдете один максимум, остальные, как правило, будут его соседями.

Метод findpeaks находит разделенные пики. Расположение этих пиков - первые две строки в выводе.

Две средние строки - это значения максимумов 10.

Последние две строки - это местоположения самых больших точек с использованием среза. Как видно, вы просто получаете несколько смежных точек.

1 Ответ

0 голосов
/ 29 мая 2019

scipy.signal.find_peaks это именно то, что вы ищете :-)
из документы , ключевое слово distance делает именно это - требует, чтобы пик был выше, чем все точки дорасстояние distance от него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...