Как я могу найти совпадающие элементы и индексы из двух массивов?

#python #match #intersection #indices #idl

#python #совпадение #пересечение #индексы #idl

Вопрос:

Например,

 a = [1, 1, 2, 4, 4, 4, 5, 6, 7, 100]
b = [1, 2, 2, 2, 2, 4, 5, 7, 8, 100]
 

Я могу найти совпадающие элементы, используя:

 np.intersect1d(a,b)
 

Вывод:

 array([  1,   2,   4,   5,   7, 100])
 

Тогда как я могу получить индексы совпадающих элементов в массивах a и b , соответственно?

В IDL есть функция как "match" https://www.l3harrisgeospatial.com/docs/match.html

Есть ли подобная функция в Python?

Ответ №1:

Использовать return_indices в numpy.intersect1d :

 intersect, ind_a, ind_b = np.intersect1d(a,b, return_indices=True)
 

Вывод:

 intersect
# array([  1,   2,   4,   5,   7, 100])
ind_a
# array([0, 2, 3, 6, 8, 9], dtype=int64)
ind_b
# array([0, 1, 5, 6, 7, 9], dtype=int64)
 

Который затем можно использовать повторно, например:

 np.array(a)[ind_a]
np.array(b)[ind_b]

array([  1,   2,   4,   5,   7, 100])
 

Комментарии:

1. иногда мы просто упускаем из виду документацию, которая дает нам все, что нам нужно 🙂

Ответ №2:

вы можете отслеживать индексы, используя enumerate следующее:

 a = [1, 1, 2, 4, 4, 4, 5, 6, 7, 100]
b = [1, 2, 2, 2, 2, 4, 5, 7, 8, 100]
#    0  1  2  3  4  5  6  7  8   9

print([i for i,x in enumerate(zip(a,b)) if x[0] == x[1]])
 
 [0, 2, 5, 6, 9]
 

итак, что здесь происходит ?!

Мы используем преимущества потрясающей enumerate функции! Эта функция генерирует кортеж для каждого элемента в итерируемом, причем первый элемент является перечислением (или индексом в данном случае), а второй — итерируемым.

Вот как zip(a,b) выглядит перечисление

 [(0, (1, 1)), (1, (1, 2)), (2, (2, 2)), (3, (4, 2)), (4, (4, 2)), (5, (4, 4)), (6, (5, 5)), (7, (6, 7)), (8, (7, 8)), (9, (100, 100))]

# lets look a little closer at one element
(0, (1, 1))
# ^     ^
# index iterable
 

С этого момента все просто! Распакуйте итерируемый и проверьте, равны ли оба элемента, и если они равны, то используйте добавить перечисление # в список!

Ответ №3:

Используйте range так:

 matching_idxs = [idx for idx in range(len(a)) if a[idx] == b[idx]] 
print(matching_idxs)
# [0, 2, 5, 6, 9]
 

Ответ №4:

Используя enumerate и zip :

 a = [1, 1, 2, 4, 4, 4, 5, 6, 7, 100]
b = [1, 2, 2, 2, 2, 4, 5, 7, 8, 100]

output = [(i, x) for i, (x, y) in enumerate(zip(a, b)) if x == y]

print(output)
 

 [(0, 1), (2, 2), (5, 4), (6, 5), (9, 100)]
 

В результате список кортежей будет (index, value)

Ответ №5:

это очень просто с помощью zip функции для параллельного цикла двух списков:

 >>> count = 0
>>> indices = []
>>> for x, y in zip(a, b):
    if x == y:
        indices.append(count)
    count  = 1

    
>>> indices
[0, 2, 5, 6, 9]