Как эффективно найти локальные минимумы гладкого многомерного массива в NumPy?

Допустим, у меня есть массив в NumPy, содержащий оценки непрерывной дифференцируемой функции, и я хочу найти локальные минимумы. Здесь нет шума, поэтому каждая точка, значение которой ниже, чем значения всех ее соседей, соответствует моему критерию локального минимума.

У меня есть следующее понимание списка, которое работает для двумерного массива, игнорируя потенциальные минимумы на границы:

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

Однако это довольно медленно. Я также хотел бы, чтобы это работало для любого количества измерений. Например, есть ли простой способ получить всех соседей точки в массиве любых размеров? Или я вообще неправильно подхожу к этой проблеме? Должен ли я использовать вместо этого numpy.gradient () ?

12
задан ptomato 21 October 2010 в 10:11
поделиться