Digamos que tengo una matriz en NumPy que contiene evaluaciones de una función diferenciable continua, y quiero encontrar las mínimas locales. No hay ruido, por lo que cada punto cuyo valor es inferior a los valores de todos sus vecinos cumple mi criterio para un mínimo local.¿Cómo encontrar los mínimos locales de una matriz multidimensional suave en NumPy de manera eficiente?
que tienen la siguiente lista por comprensión, que trabaja para una matriz de dos dimensiones, haciendo caso omiso de potencial en los límites mínimos:
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
Sin embargo, esto es bastante lento. También me gustaría hacer que esto funcione en cualquier cantidad de dimensiones. Por ejemplo, ¿hay una manera fácil de obtener todos los vecinos de un punto en una matriz de cualquier dimensión? ¿O me estoy acercando a este problema por completo? ¿Debería usar el numpy.gradient()
?
Encontrando los máximos globales: http://stackoverflow.com/questions/3584243/python-get-the-position-of-the-biggest-item-in-an-numpy-array/3584260#3584260 – endolith