Wie finden Sie die lokalen minima der glatten mehrdimensionales array, in NumPy effizient?
Sagen, ich habe ein array in NumPy enthält Auswertungen der eine kontinuierliche differenzierbare Funktion, und ich möchten, finden Sie die lokalen minima. Es gibt keine Geräusche, so dass jeder Punkt, dessen Wert niedriger ist als die Werte, die von allen seinen Nachbarn erfüllt mein Kriterium für ein lokales minimum.
Habe ich die folgende Liste Verständnis, die arbeiten für ein zwei-dimensionales array, ignorieren von potentiellen minima auf die Grenzen:
import numpy as N
def local_minima(array2d):
local_minima = [ index
for index in N.ndindex(array2d.shape)
if index[0] > 0
if index[1] > 0
if index[0] < array2d.shape[0] - 1
if index[1] < array2d.shape[1] - 1
if array2d[index] < array2d[index[0] - 1, index[1] - 1]
if array2d[index] < array2d[index[0] - 1, index[1]]
if array2d[index] < array2d[index[0] - 1, index[1] + 1]
if array2d[index] < array2d[index[0], index[1] - 1]
if array2d[index] < array2d[index[0], index[1] + 1]
if array2d[index] < array2d[index[0] + 1, index[1] - 1]
if array2d[index] < array2d[index[0] + 1, index[1]]
if array2d[index] < array2d[index[0] + 1, index[1] + 1]
]
return local_minima
Jedoch ist dies ziemlich langsam. Ich würde auch gerne diese arbeiten für eine beliebige Anzahl von Dimensionen. Zum Beispiel, gibt es einen einfachen Weg, um alle Nachbarn eines Punktes in einem array von beliebigen Dimensionen? Oder bin ich an dieses problem der falsche Weg insgesamt? Soll ich mich mit numpy.gradient()
statt?
- Finden Sie die globalen maxima: stackoverflow.com/questions/3584243/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lage der lokalen minima können gefunden werden für ein array beliebiger dimension
mit Ivan's detect_peaks Funktion, mit geringfügigen änderungen:
die Sie verwenden können, wie diese:
Sagt die minima treten bei Indizes [0,0,3], [0,4,0], [1,1,1] und [1,3,3]:
Versuchen, diese für 2D:
Diese werden Sie wieder ein array2d-wie-array mit True/False, wo lokale minima (vier Nachbarn) befinden.
&
's statt&&
's, und erfordert Klammern um die Vergleiche, es läuft aber dreißig mal schneller als mein original.