我有一个代码,其中使用随机值生成曲线。和一条穿过它的水平线。代码如下。
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)
现在我需要找到曲线(数据)和线的所有交点的坐标。该曲线由连接相邻点的线性段组成。并且曲线与线相交的点有很多交点。任何帮助,将不胜感激。谢谢!
答案 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()
答案 1 :(得分:2)
我认为,正如你所解释的那样,曲线确实遵循一个等式。特别是,它由连接相邻点的线性段组成。
以下是您可以做的事情:
答案 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")
输出: