Допустим, у меня есть массив в 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 ()
?