Numpy 数组,如何测试一个值是否是局部最小值

Numpy array, how to test if a value is the local minimum

我有一个二维 Numpy 数组,例如:

array([[0.87, 0.13, 0.18, 0.04, 0.79],
       [0.07, 0.58, 0.84, 0.82, 0.76],
       [0.12, 0.77, 0.68, 0.58, 0.8 ],
       [0.43, 0.2 , 0.57, 0.91, 0.01],
       [0.43, 0.74, 0.56, 0.11, 0.58]])

我想测试每个数字以评估它是否是 x*y 的 window 内的局部最小值,例如,3x3 window 会 return 这个

array([[False, False, False,  True, False],
       [ True, False, False, False, False],
       [False, False, False, False, False],
       [False, False, False, False,  True],
       [False, False, False, False, False]])

我想避免使用原生 python 循环,因为我的数组非常大

您可以使用 scipy.ndimage.minimum_filter 计算 2D 最小值,然后与原始值进行比较:

from scipy.ndimage import minimum_filter

mins = minimum_filter(a, mode='constant', size=(3,3), cval=np.inf)

a==mins # or np.isclose(a, mins)

输出:

array([[False, False, False,  True, False],
       [ True, False, False, False, False],
       [False, False, False, False, False],
       [False, False, False, False,  True],
       [False, False, False, False, False]])

中级 mins:

array([[0.07, 0.07, 0.04, 0.04, 0.04],
       [0.07, 0.07, 0.04, 0.04, 0.04],
       [0.07, 0.07, 0.2 , 0.01, 0.01],
       [0.12, 0.12, 0.11, 0.01, 0.01],
       [0.2 , 0.2 , 0.11, 0.01, 0.01]])