Объединение совпадений массива в Python - PullRequest
0 голосов
/ 14 июля 2020

Это кажется довольно сложной задачей. Позвольте мне объяснить сценарий небольшими примерами.

Рассмотрим 5 массивов a1, a2, a3, a4 и a5. Эти массивы не важны, я упоминаю их для полноты картины. Рассмотрим 4 массива совпадений m1, m2, m3, m4 размеров 10, 9, 11 и 10. Каждый массив в основном сообщает вам, какой элемент первого массива a<i> соответствует второму a<i+1>.

Например. if m1 = [-1, 0, 2, -1, 3, 8, 7, -1, 9, 5] Это означает, что элемент 0 th из a1 не имеет соответствия, 1 st из a1 совпадает с 0 th элемент из a2 и элемент 2 nd из a1 совпадает с элементом 2 nd из a2.

Таким образом, размер m1 = размер a1 и размер m2 = размер a2 et c.

Аналогично, если m2 = [-1, 0, 2, 6, 3, 8, 7, -1, 9, 5] устанавливает соответствующие совпадения между a2 и a3 .

Вот мой вопрос. Можно ли узнать, какой элемент из a1 соответствует элементам из a3? Моя конечная цель - установить sh это соответствие между a1 и a5.

Для a1 - a3 мой сопоставленный новый массив будет m = [-1, -1, 2, -1, 6, 9, -1, -1, 5, 8]. Чтобы объяснить, как я получаю этот массив m, например. m[4] = m2[m1[4]].

Какой наиболее эффективный способ сделать это?

Несколько примечаний:

  1. -1 - это просто индикатор, который совпадения нет, и его можно заменить чем-нибудь, что упростило бы проблему. из-за правил индексации Python / numpy, m2[-1] будет считаться последним элементом m2, что в данном случае нежелательно
  2. Это просто игрушечный пример, и мои массивы совпадают с массивами будет иметь размеры ~ 2000 элементов.

Если кому-то интересно его применение, или если дополнительная информация может помочь, это относится к сопоставлению функций изображений. Используя opencv, я извлекаю orb функции и выполняю сопоставление функций между тремя изображениями I 1 , I 2 и I 3 . У меня есть соответствия между I 1 -I 2 и I 2 -I 3 , и я хотел бы вычислить совпадения между I 1 -I 3 косвенно с использованием двух вышеуказанных соответствий.

1 Ответ

0 голосов
/ 14 июля 2020

Один из подходов, который вы могли бы сделать, - это добавить каждый массив m1, m2, .... одним значением. Затем замените это дополнительное значение и '-1' на (длину-1) следующего массива m2, m3, ... соответственно.

Но в последнем массиве измените '-1' на 'no match '(или любое другое значение, которое вы предпочитаете) и добавьте то же значение.

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, .... вы получите одну дополнительную длину. Поэтому, если вы используете его где-то еще, будьте осторожны с любыми ошибками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...