【问题标题】:Interpolation of curve曲线插值
【发布时间】:2016-01-12 10:52:02
【问题描述】:

我有一个使用随机值生成曲线的代码。和一条穿过它的水平线。代码如下。

import numpy as np
import matplotlib.pylab as pl

data = np.random.uniform(low=-1600, high=-550, size=(288,))
line = [-1290] * 288

pl.figure(figsize = (10,5))
pl.plot(data)
pl.plot(line)

现在我需要找到曲线(数据)和直线的所有交点的坐标。曲线由连接相邻点的线段组成。曲线与直线相交的交点很多。任何帮助,将不胜感激。谢谢!

【问题讨论】:

标签: python numpy scipy


【解决方案1】:

我喜欢the Shapely answer,因为Shapely 很棒,但你可能不想要那种依赖。这是我在信号处理中使用的一些代码的一个版本,改编自this Gist by @endolith。它基本上实现了kazemakase's suggestion

from matplotlib import mlab

def find_crossings(a, value):
    # Normalize the 'signal' to zero.
    sig = a - value

    # Find all indices right before any crossing.
    indices = mlab.find((sig[1:] >= 0) & (sig[:-1] < 0) | (sig[1:] < 0) & (sig[:-1] >= 0))

    # Use linear interpolation to find intersample crossings.
    return [i - sig[i] / (sig[i+1] - sig[i]) for i in indices]

这将返回曲线与值相交的索引(您的 x 值)(在您的情况下为-1290)。你可以这样称呼它:

find_crossings(data, -1290)

这是我得到 100 分的结果:

x = find_crossings(data, -1290)
plt.figure(figsize=(10,5))
plt.plot(data)
plt.plot(line)
plt.scatter(x, [-1290 for p in x], color='red')
plt.show()

【讨论】:

    【解决方案2】:

    我认为,正如您所解释的那样,曲线实际上确实遵循一个方程。特别是,它由连接相邻点的线性段组成。

    你可以这样做:

    1. 查找所有一对邻居,其中一个位于该行之上,另一个位于该行之下
    2. 为每一对找到水平线与连接点的线的交点

    【讨论】:

      【解决方案3】:

      这是一个使用shapely的解决方案:

      import numpy as np
      import matplotlib.pylab as pl
      np.random.seed(0)
      data = np.random.uniform(low=-1600, high=-550, size=(50,))
      line = [-1290] * len(data)
      
      pl.figure(figsize = (10,5))
      pl.plot(data)
      pl.plot(line)
      
      from shapely import geometry
      
      line = geometry.LineString(np.c_[np.arange(len(data)), data])
      hline = geometry.LineString([[-100, -1290], [1000, -1290]])
      
      points = line.intersection(hline)
      
      x = [p.x for p in points]
      y = [p.y for p in points]
      
      pl.plot(x, y, "o")
      

      输出:

      【讨论】:

        猜你喜欢
        • 2015-01-19
        • 1970-01-01
        • 2016-06-07
        • 2023-03-19
        • 1970-01-01
        • 2022-08-09
        • 2012-07-06
        • 2016-03-01
        • 1970-01-01
        相关资源
        最近更新 更多