Find numpy array coordinates of neighboring maximum
我在这个问题中使用了公认的答案来获得2维或更多维的numpy数组中的局部最大值,这样我就可以为它们分配标签。现在,我还想将这些标签分配给数组中的相邻单元格,这取决于渐变——即,一个单元格与具有最大值的相邻单元格具有相同的标签。通过这种方式,我可以迭代地将标签分配给整个数组。
假设我有一个类似于
1 2 3 4 | >>> A = np.array([[ 1. , 2. , 2.2, 3.5], [ 2.1, 2.4, 3. , 3.3], [ 1. , 3. , 3.2, 3. ], [ 2. , 4.1, 4. , 2. ]]) |
应用
1 2 3 4 5 | >>> scipy.ndimage.filters.maximum_filter(A, size=3) array([[ 2.4, 3. , 3.5, 3.5], [ 3. , 3.2, 3.5, 3.5], [ 4.1, 4.1, 4.1, 4. ], [ 4.1, 4.1, 4.1, 4. ]]) |
号
现在,对于这个数组中的每个单元格,我希望得到过滤器找到的最大值的坐标,即。
1 2 3 4 | array([[[1,1],[1,2],[0,3],[0,3]], [[2,1],[2,2],[0,3],[0,3]], [[3,1],[3,1],[3,1],[3,2]], [[3,1],[3,1],[3,1],[3,2]]]) |
然后,我将使用这些坐标迭代地分配标签。
我可以用循环来处理二维,忽略边界。
1 | highest_neighbor_coordinates = np.array([[(argmax2D(A[i-1:i+2, j-1:j+2])+np.array([i-1, j-1])) for j in range(1, A.shape[1]-1)] for i in range(1, A.shape[0]-1)]) |
。
但是在看到
我们可以使用带反射元素的PAD来模拟最大滤波操作,并在其上使用
1 2 3 4 5 6 7 8 9 10 11 12 | from skimage.util import view_as_windows as viewW def window_argmax_global2D(A, size): hsize = (size-1)//2 # expects size as odd number m,n = A.shape A1 = np.pad(A, (hsize,hsize), mode='reflect') idx = viewW(A1, (size,size)).reshape(-1,size**2).argmax(-1).reshape(m,n) r,c = np.unravel_index(idx, (size,size)) rows = np.abs(r + np.arange(-hsize,m-hsize)[:,None]) cols = np.abs(c + np.arange(-hsize,n-hsize)) return rows, cols |
样品运行-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | In [201]: A Out[201]: array([[1. , 2. , 2.2, 3.5], [2.1, 2.4, 3. , 3.3], [1. , 3. , 3.2, 3. ], [2. , 4.1, 4. , 2. ]]) In [202]: rows, cols = window_argmax_global2D(A, size=3) In [203]: rows Out[203]: array([[1, 1, 0, 0], [2, 2, 0, 0], [3, 3, 3, 3], [3, 3, 3, 3]]) In [204]: cols Out[204]: array([[1, 2, 3, 3], [1, 2, 3, 3], [1, 1, 1, 2], [1, 1, 1, 2]]) |
号
延伸至
我们将使用
1 2 3 4 5 6 7 8 9 10 | def window_argmax_global(A, size): hsize = (size-1)//2 # expects size as odd number shp = A.shape N = A.ndim A1 = np.pad(A, (hsize,hsize), mode='reflect') idx = viewW(A1, ([size]*N)).reshape(-1,size**N).argmax(-1).reshape(shp) offsets = np.ogrid[tuple(map(slice, shp))] out = np.unravel_index(idx, ([size]*N)) return [np.abs(i+j-hsize) for i,j in zip(out,offsets)] |