我使用了这个问题的被接受的答案,以便于在numpy的2维或更高维数组中获取局部最大值,以便为其分配标签。 现在我想根据梯度将这些标签分配给数组中相邻的单元格 - 即单元格获得与具有最高值的相邻单元格相同的标签。 这样,我可以迭代地为整个数组分配标签。
假设我有一个名为
现在,对于这个数组中的每个单元格,我想要筛选器找到的最大值的坐标,即:
我会使用这些坐标进行迭代式标签分配。
我可以使用循环来处理两个维度,忽略边界。
假设我有一个名为
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维)解决方案。
'reflect'
和np.abs(i+j+hsize)
的工作方式,可以包括边框单元格并仍然返回原始数组的正确索引。 - Raketenolli