【问题标题】:Chaining array matches in Python在 Python 中链接数组匹配
【发布时间】:2020-11-03 18:17:39
【问题描述】:

这似乎是一项相当复杂的任务。让我用一些小例子来解释一下这个场景。

考虑 5 个数组 a1a2a3a4a5。这些数组并不重要,为了完整起见,我提到它们。考虑 4 个匹配数组 m1m2m3m4,大小为 1091110。每个数组基本上都会告诉您第一个数组a<i> 的哪个元素与第二个a<i+1> 匹配。

例如。如果m1 = [-1, 0, 2, -1, 3, 8, 7, -1, 9, 5] 表示a1的第0th元素没有匹配,a1的第1st匹配第0tha2 的元素和a1 的第二个nd 元素与a2 的第二个nd 元素匹配。

因此,m1 的大小 = a1 的大小和 m2 的大小 = a2 的大小等等。

同样,如果m2 = [-1, 0, 2, 6, 3, 8, 7, -1, 9, 5] 它建立a2a3之间的对应匹配。

这是我的问题。是否可以找出a1 中的哪个元素对应于a3 中的元素?我的最终目标是在a1a5 之间建立这种对应关系。

对于a1a3,我匹配的新数组将是m = [-1, -1, 2, -1, 6, 9, -1, -1, 5, 8]。解释我如何得到这个m 数组,例如。 m[4] = m2[m1[4]].

最有效的方法是什么?

几点说明:

  1. -1 只是一个指标,表示没有 匹配并且可以用任何会导致问题的东西替换 更容易。
  2. 我面临的最大问题是 m2[m1[7]] 理想情况下应该是 -1 因为 m1[7]-1,然而,由于 Python/numpy 索引规则,m2[-1] 将被视为m2 的最后一个元素,不是 在这种情况下是可取的
  3. 这只是一个玩具示例,我的数组和匹配数组的大小约为 2000 个元素。

如果有人对其应用感兴趣,或者额外的信息会有所帮助,这与图像特征匹配有关。使用opencv 提取orb 特征并在三个图像I1、I2 和I3 之间进行特征匹配。我在 I1-I2 和 I2-I3 之间有对应关系,并且想计算匹配项I1-I3之间间接使用了以上两个对应关系。

【问题讨论】:

  • 您应该提供所有阵列的样本以及每个步骤的预期输出。
  • 它不完全由m1, m2... 定义,例如a1 = [0, 1], a2 = [1, 2], a3 = [0, 1]: m1 = [-1, 0], m2=[1, -1]; m13 = [0, 1] 而是a1 = [9, 1], a2 = [1, 2], a3 = [0, 1]: m1 = [-1, 0], m2=[1, -1]; m13 = [-1, 1]
  • 嘿@Chris,我已经给出了m1m2 的示例,我的预期输出为m。如果我了解如何连续 2 场比赛做到这一点,我总是可以将其推断为链中的进一步比赛
  • @V.Ayrat 最好假设a1a2 等与这个问题无关,因为我只关心匹配的数组m1m2 等。 a 数组或多或少是独立获得的。
  • 消除第二点问题的一种方法是将所有矩阵附加一个元素并将它们保留为-1。因此,在m2[m1[7]] 中,m1[7] 将是 -1m2[-1] 将再次成为 -1,因为我们在最后一个位置添加了 -1

标签: python arrays numpy opencv indexing


【解决方案1】:

您可以做的一种方法是将每个数组 m1, m2, .... 加上一个值。 然后分别用下一个数组 m2, m3, ... 的 (length-1) 替换那个额外的值和 '-1'。

但是,在最后一个数组中,将“-1”更改为“不匹配”(或您喜欢的任何其他值),并附加相同的值。

m1 = [-1, 0, 2, -1, 3, 8, 7, -1, 9, 5]
m2 = [-1, 0, 2, 6, 3, 8, 7, -1, 9, 5]

m_list = [m1, m2]

for i in range(len(m_list)-1):
    m_list[i] = [len(m_list[i+1]) if x==-1 else x for x in m_list[i]]
    m_list[i].append(len(m_list[i+1]))
m_list[len(m_list)-1] = ['no match' if x==-1 else x for x in m_list[len(m_list)-1]]
m_list[len(m_list)-1].append('no match')

m1, m2 = m_list

现在如果你运行m2[m1[7]],你的输出将是'no match'

注意:m1, m2, .... 你会得到一个额外的长度。因此,如果 您正在其他地方使用它,请注意任何错误。

【讨论】:

    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    相关资源
    最近更新 更多