曲线插值

时间:2016-01-12 10:52:03

标签: python numpy scipy

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

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)

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

3 个答案:

答案 0 :(得分:3)

我喜欢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()

Random function zero crossings

答案 1 :(得分:2)

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

以下是您可以做的事情:

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

答案 2 :(得分:2)

以下是使用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")

输出:

enter image description here