2D数组之间的交点

时间:2019-03-18 15:59:44

标签: python numpy

我有两个数组,如下所示:

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中实现了吗?

1 个答案:

答案 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')

Plot of intersection