【问题标题】:How to efficienctly find the top border line of a graph in python如何在python中有效地找到图形的上边界线
【发布时间】:2018-01-08 11:44:53
【问题描述】:

我有一组图表,我想从中找到轮廓图(this 图中的黑线。)

不可能在 x 轴上的所有点找到每个图的最大值,因为所有图的 x 值都不相同。这些点精确到小数点后几位。 this图或许能帮助理解更好。

我尝试将每个图形转换为一个多边形并使用 shapely cascaded_union 然后从底部裁剪。 它适用于少量图形,但当图形数量变大时。这需要很多时间。

还有其他有效的方法吗?

【问题讨论】:

  • 图表是如何表示的?你能得到每个点的所有图表的max 吗?
  • 这是不可能的,因为 x 值精确到小数位,并且 x 值可能没有每个图形的值。
  • 我是否理解正确,当在某个值 x 处没有测量值时,您 1)在属于一起(相同颜色)和环绕 x 的测量值之间进行线性插值,2)取其中的最大值x 处的插值?
  • 是的,没错。但对大量数据执行此操作需要的时间太长。

标签: python algorithm graph union polygon


【解决方案1】:

按 x 坐标对所有点进行排序。

您的最终输出将具有有限数量的像素。您可以计算落在每个像素内的 x 值的范围(小范围但不是 0)。因此,将您的积分分成几桶。由于它们已经排序,您只需在列表中前进,直到值属于下一个范围。

对于每个像素列,计算您找到的最大 y 值。在 (x, y) 处为黑线添加一个点。

这个复杂度将是 o(N logN)。

如果您在 x 轴上有间隙,您可以选择跳过它并在黑线上有一个间隙,或者只是在相邻值之间进行插值。如果您将黑线绘制为线段的集合,您可以跳过为该列生成一个点,让渲染器为您进行插值。

如果您的原始点太少(它们跳过像素),您的线条可能看起来参差不齐(上下跳跃)。您可以通过为在该范围内没有点的函数添加插值来避免这种情况。线性插值应该可以正常工作。确保您生成尝试在区间的开始和结束处生成一个点并取较大的 y 值。

【讨论】:

    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多