我有两个数组,如下所示:
X1 = np.array([[x11, x12, x13 ... x1n],[y11, y12, y13, ... , y1n]])
X2 = np.array([[x21, x22, x23 ... x2n],[y21, y22, y23, ... , y2n]])
我想将这些基本概念化为分段线性函数,并提出一个交点intercept
:
intercept = (x_int, y_int)
我对数组交集所做的每次搜索都给出完全不相关的结果,因为两个数组的交集还具有查找两个数组共有的元素(而不是交点)的意思。
我也找到了这个interesting post,但是对于我的应用程序来说似乎太复杂了。如果必须实现这一点,我想可以,因为这将涉及线方程的重复计算以及线方程之间的点的交点。但是,我首先要检查经过良好测试的库中是否已经存在一些健壮的实现,因为我的不当尝试可能要花费数小时/天才能达到,然后不一定适用于任何数据集。
这已经在python中实现了吗?
答案 0 :(得分:0)
第1步:使用x1和x2的并集。
第2步:线性插值以找到联合中每个点的y1和y2。
步骤3:找出y1-y2改变符号的位置。
步骤4:求解交点的线性方程。
import numpy as np
def intersect_piecewise(X1, X2):
x = np.union1d(X1[0], X2[0])
y1 = np.interp(x, X1[0], X1[1])
y2 = np.interp(x, X2[0], X2[1])
dy = y1 - y2
ind = (dy[:-1] * dy[1:] < 0).nonzero()[0]
x1, x2 = x[ind], x[ind+1]
dy1, dy2 = dy[ind], dy[ind+1]
y11, y12 = y1[ind], y1[ind+1]
y21, y22 = y2[ind], y2[ind+1]
x_int = x1 - (x2 - x1) * dy1 / (dy2 - dy1)
y_int = y11 + (y12 - y11) * (x_int - x1) / (x2 - x1)
return x_int, y_int
您需要求解的方程是
(x_int-x1)/(x2-x1)=(0-dy1)/(dy2-dy1)
=(y_int-y11)/(y12-y11)=(y_int-y21)/(y22-y21)
修改:让我们尝试一下
import matplotlib.pyplot as plt
x = np.linspace(-2, 2, 17)
X1 = np.stack((x[::2], x[::2]**2))
X2 = np.stack((x[1::2], 4 - x[1::2]**2))
x_int, y_int = intersect_piecewise(X1, X2)
plt.plot(X1[0], X1[1], 'bo-', X2[0], X2[1], 'bo-', x_int, y_int, 'rs')