1

我有二维离散空间数据。我想对这些数据的空间边界进行近似,这样我就可以生成一个带有另一个数据集的图。

理想情况下,这将是 matplotlib 可以使用 plt.Polygon() 补丁绘制的一组有序 (x,y) 点。

我最初的尝试非常不优雅:我在数据上放置了一个精细的网格,并且在单元格中找到数据的地方,从该单元格创建了一个方形 matplotlib 补丁。因此,边界的分辨率取决于网格的采样频率。这是一个示例,其中灰色区域是包含数据的单元格,黑色区域是不存在数据的单元格。

第一次尝试 http://astro.dur.ac.uk/~dmurphy/data_limits.png

好的,问题解决了——为什么我还在这里?嗯....我想要一个更“优雅”的解决方案,或者至少一个更快的解决方案(即。我不想继续“真正的”工作,我想从中获得一些乐趣!)。我能想到的最好方法是光线追踪方法 - 例如:

  1. 从 xmin 到 xmax,在 y=ymin,检查数据边界是否在间隔 dx 中交叉
  2. y=ymin+dy,做 1
  3. 做 1-2,但现在在 y 中采样

另一种方法是定义一个中心,并在 r-theta 空间中采样 - 即 dtheta 增量中的径向辐条。

两者都会产生一组(x,y)点,但是我如何排序/链接相邻点以创建边界?

最近邻方法是不合适的,例如(借用地理),地峡(想想连接 N&S America 的巴拿马)然后可以关闭和隔离区域。这也可能无法很好地处理数据中看到的漏洞,我想将其表示为不同的 plt.Polygon。

解决方案可能来自解决面积最大化问题。对于定义数据限制的一组点,这些点中包含的最大连续区域是多少为了形成封闭区域,第 n 个点的相邻点是多少?在这个方案中将如何处理这些漏洞 - 现在这是否会导致拓扑错误?

抱歉,这大部分是我大声思考的。对于一些提示、建议或解决方案,我将不胜感激。我怀疑这是许多解决方案技术经常研究的问题,但我正在寻找一些简单的代码和快速运行的东西......我想每个人都是,真的!

~~~~~~~~~~~~~~~~~~~~~~~~~

好的,这是使用 Mark 的凸包概念的尝试 #2: 替代文本 http://astro.dur.ac.uk/~dmurphy/data_limitsv2.png

为此,我使用了 qhull 包中的 qconvex,让它返回极端顶点。对于那些感兴趣的人:

猫 [数据] | qconvex Fx > out

周边的采样似乎很低,虽然我没有玩太多设置,但我不相信我可以提高保真度。

4

2 回答 2

2

我认为您正在寻找的是数据的凸包这将给出一组点,如果连接将意味着您的所有点都在连接点上或连接点内

于 2010-05-18T10:13:54.000 回答
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])
于 2010-05-19T03:06:25.553 回答