#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]