python - 在 Python 中按位置有效地对坐标点列表进行分组

标签 python algorithm grid

给定二维网格上的 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/

相关文章:

algorithm - 有向无环图的差异

c - 使用递归查找具有相同数量的 0's and 1' 的最大子数组的长度

Java 网格布局 GUI - 如何在事件中进入新 Pane ?

python - 日期时间 'has no attribute now'

python - 错误 'int'对象不可下标python

algorithm - 如何识别一些二叉搜索树遍历是后序还是中序?

python - 分配许多简单网络任务的解决方案?

python - 无法在 Ubuntu 上安装 TA-Lib

python - 响应不为空时,scrapy xpath 返回空列表

header - 如何修复 Extjs 4.2 中的表头