Supponiamo di avere un array in NumPy contenente valutazioni di una funzione continua differenziabile, e voglio trovare i minimi locali. Non c'è rumore, quindi ogni punto il cui valore è inferiore ai valori di tutti i suoi vicini soddisfa il mio criterio per un minimo locale.Come trovare i minimi locali di un array multidimensionale uniforme in NumPy in modo efficiente?
Ho la seguente lista di comprensione, che lavora per una matrice bidimensionale, ignorando il potenziale minimi sui confini:
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
Tuttavia, questo è piuttosto lento. Mi piacerebbe anche farlo funzionare per qualsiasi numero di dimensioni. Ad esempio, esiste un modo semplice per ottenere tutti i vicini di un punto in un array di qualsiasi dimensione? O sto affrontando questo problema nel modo sbagliato del tutto? Dovrei usare numpy.gradient()
?
Trovare i massimi globali: http://stackoverflow.com/questions/3584243/python-get-the-position-of-the-biggest-item-in-an-numpy-array/3584260#3584260 – endolith