【问题标题】:intersection point between 2D arrays二维数组之间的交点
【发布时间】:2019-03-18 15:59:43
【问题描述】:

我有两个数组如下:

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

【问题讨论】:

  • 如果您可以将您的 Numpy 数组转换为函数,这可能有用吗? scipy-cookbook.readthedocs.io/items/Intersection.html
  • 这篇文章也很有帮助stackoverflow.com/questions/43016174/…
  • 您的措辞似乎暗示存在一个交点;但不能假设一般情况。至于解决这个问题的策略,它实际上取决于数组的预期大小。如果它们很小或可以做出假设,例如 x 总是排序和增加,则可以应用简单的解决方案。但如果这些是任意分段曲线,则几乎必须使用单独的宽相碰撞算法来避免 O(n^2) 性能。
  • 它不必是一个交点。可以是交点数组

标签: python numpy


【解决方案1】:

第 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')

【讨论】:

  • 我认为它适用于多个交叉点。如果ind 是一个数组,那么其他所有内容也是如此。我想我应该试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2022-12-08
相关资源
最近更新 更多