python - 查找相邻最大值的numpy数组坐标

标签 python numpy multidimensional-array

我使用了已接受的答案 in this question在 2 维或更多维的 numpy 数组中获得局部最大值,以便我可以为它们分配标签。现在我还想根据梯度将这些标签分配给数组中的相邻单元格——即一个单元格获得与具有最高值的相邻单元格相同的标签。这样我就可以迭代地为我的整个数组分配标签。

假设我有一个像A这样的数组

>>> 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. ]])

应用 maximum_filter 我得到

>>> 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. ]])

现在,对于这个数组中的每个单元格,我想要过滤器找到的最大值的坐标,即

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]]])

然后我会使用这些坐标迭代地分配我的标签。

我可以使用循环在两个维度上执行此操作,忽略边界

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)])

但在看到 scipy.ndimage 中的许多过滤器函数后,我希望会有一个更优雅和可扩展(>=3 维)的解决方案。

最佳答案

我们可以使用带反射元素的 pad 来模拟最大过滤器操作,并使用 scikit-image's view_as_windows 在其上获得滑动窗口。 ,计算扁平化的 argmax 索引,偏移具有范围值的索引以转换为全局尺度 -

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    

sample 运行-

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]])

扩展到 n-dim

我们将使用 np.ogrid 作为这个扩展部分:

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)]

关于python - 查找相邻最大值的numpy数组坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48328133/

相关文章:

python - 加快循环过滤字符串的速度

python - numpy 用数组填充数组

java - 如何打印正在生成的房屋的 x 和 y 值?

python - 为什么 gmtime 和 utcnow 日期时间之间有 1 小时的差异?

python - 参数解析 : How to make mutually exclusive arguments optional?

python - signal.correlate 'same'/'full' 含义?

python - 线性回归——降低自由度

javascript - 从 JavaScript 数组中删除嵌套的空值

ruby - 无意中在 ruby​​ 中重新分配了变量值

python - 为什么 python `any` 返回一个 bool 值而不是值?