给定二维网格上的 X、Y 坐标点列表,创建相邻坐标点组列表的最有效算法是什么?
例如,给定构成网格 (15x15) 上两个不相邻正方形 (3x3) 的点列表,此算法的结果将是对应于这两个正方形的两组点。
我想你可以做一个洪水填充算法,但这似乎有点过头了,而且对于 1024 大小的大型二维数组来说效率不高。
最佳答案
从根本上说,这是一个图像处理操作。如果您使用像 scikit-image 这样的图像处理库(又名 skimage
),这很容易。处理真正庞大的数据最终会变慢,但 1024x1024 算不了什么。
In [1]: import numpy as np
In [2]: import skimage.morphology
In [3]: x = [0,1,2,0,1,2,0,1,2,-3,-2,-1,-3,-2,-1,-3,-2,-1]
In [4]: y = [0,0,0,1,1,1,2,2,2,-3,-3,-3,-2,-2,-2,-1,-1,-1]
In [5]: dense = np.zeros((9,9), dtype=bool)
In [6]: dense[y,x] = True
In [7]: print(dense)
[[ True True True False False False False False False]
[ True True True False False False False False False]
[ True True True False False False False False False]
[False False False False False False False False False]
[False False False False False False False False False]
[False False False False False False False False False]
[False False False False False False True True True]
[False False False False False False True True True]
[False False False False False False True True True]]
In [8]: labeled = skimage.morphology.label(dense)
In [9]: print(labeled)
[[1 1 1 0 0 0 0 0 0]
[1 1 1 0 0 0 0 0 0]
[1 1 1 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 2 2 2]
[0 0 0 0 0 0 2 2 2]
[0 0 0 0 0 0 2 2 2]]
In [10]: coords_yx = { i: (labeled == i).nonzero() for i in range(1,labeled.max()+1) }
In [11]: coords_yx
Out[11]:
{1: (array([0, 0, 0, 1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2, 0, 1, 2])),
2: (array([6, 6, 6, 7, 7, 7, 8, 8, 8]), array([6, 7, 8, 6, 7, 8, 6, 7, 8]))}
关于python - 在 Python 中按位置有效地对坐标点列表进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24985127/