假设我在 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()
改用吗?