我有二维离散空间数据。我想对这些数据的空间边界进行近似,以便我可以在其上生成另一个数据集。
理想情况下,这将是一组有序的(x,y)点,matplotlib可以使用plt.Polygon()补丁进行绘制。
我最初的尝试非常不优雅:我在数据上放置一个精细的网格,并且在单元格中找到数据的地方,就会创建一个方格的matplotlib补丁。因此,边界的分辨率取决于网格的采样频率。这是一个例子,灰色区域是包含数据的单元格,黑色表示没有数据。
1st attempt http://astro.dur.ac.uk/~dmurphy/data_limits.png
好的,问题解决了 - 为什么我还在这里?嗯....我想要一个更“优雅”的解决方案,或者至少一个更快的解决方案(即我不想继续“真正的”工作,我想要有一些乐趣!)。我能想到的最佳方式是射线追踪方法 - 例如:
另一种方法是定义一个中心,并在r-theta空间中进行采样 - 即以dtheta为增量的径向辐条。
两者都会产生一组(x,y)点,但是如何命令/链接相邻点来创建边界?
最近邻法是不合适的,例如(借用地理学),地峡(想想连接N& S America的巴拿马)可能会关闭并隔离地区。这也可能不太适合数据中看到的漏洞,我想将它们表示为不同的plt.Polygon。
解决方案可能来自解决区域最大化问题。对于定义数据限制的一组点,这些点中包含的最大连续区域是多少要形成封闭区域,第n个点的相邻点是多少?如何在这个方案中处理漏洞 - 这现在是错误的拓扑吗?
道歉,很多是我在大声思考。我会对一些提示,建议或解决方案表示感谢。我怀疑这是许多解决方案技术经常被研究的问题,但我正在寻找一些简单的代码和快速运行的东西...我想每个人都是,真的!~~~~~~~~~~~~~~~~~~~~~~~~~
好的,这是使用Mark关于凸壳的想法的尝试#2: alt text http://astro.dur.ac.uk/~dmurphy/data_limitsv2.png
为此,我使用qhull包中的qconvex,让它返回极端顶点。对于那些感兴趣的人:
cat [data] | qconvex Fx>出
周边的采样似乎很低,尽管我没有在设置上玩得太多,但我不相信我可以提高保真度。
答案 0 :(得分:2)
我认为你所寻找的是the Convex Hull of the data这将给出一组点,如果连接将意味着你的所有点都在连接点上或内部
答案 1 :(得分:0)
我可能会混淆一些东西,但是没有确定最大和最小x和y水平的动机是什么?除非您拥有大量数据,否则您可以简单地迭代您的点,从而快速确定最低和最高水平。
这不是最有效的示例,但如果您的数据集很小,这将不会特别慢:
import random
data = [(random.randint(-100, 100), random.randint(-100, 100)) for i in range(1000)]
x_min = min([point[0] for point in data])
x_max = max([point[0] for point in data])
y_min = min([point[1] for point in data])
y_max = max([point[1] for point in data])