Python: Сравнение векторизованных двух упорядоченных массивов int одинакового размера

Я хочу сравнить два упорядоченных массива int с одинаковым размером в Python и вывести общие элементы, которые имеют одинаковое значение в одной и той же позиции:

import numpy as np
a = np.asarray([20, 35, 226, 62, 129, 108, 156, 225, 115, 35, 162, 43, 9, 120, 181, 220])
b = np.asarray([1, 35, 69, 103, 137, 171, 205, 239, 18, 52, 86, 120, 154, 188, 222, 240])

Поэлементное сравнение даст: [35]

Вы можете мне помочь?

4 ответа

Решение

Если вы используете NumPy, тогда вы можете использовать логическую маску:

import numpy as np 
a = np.asarray([20, 35, 226, 62, 129, 108, 156, 225, 115, 35, 162, 43, 9, 120, 181, 220])
b = np.asarray([1, 35, 69, 103, 137, 171, 205, 239, 18, 52, 86, 120, 154, 188, 222, 240])
c = a[a == b]
print(c) # [35]

Вы очевидно не нуждаетесь в пересечении множества. Упакуйте списки и сравните элементы по одному индексу:

>>> [x for x, y in zip(a, b) if x==y]
[35]

Что -то подобное сделает работу, хотя использование zip более питонно...

for index, value in enumerate(a):
if value == b[index]:
    c.append(value)

Нечто подобное может работать:

l = []
for x,y in zip(a,b):
   if x == y: 
      l.append(x)

с точки зрения понимания списка можно записать так:

l = [x for x,y in zip(a,b) if x == y]

объяснение

zip(a,b) сгенерирует следующее:

>>> zip(a,b)
[(20, 1), (35, 35), (226, 69), (62, 103), (129, 137), (108, 171), (156, 205), (225, 239), (115, 18), (35, 52), (162, 86), (43, 120), (9, 154), (120, 188), (181, 222), (220, 240)]
>>>

Затем вы перебираете каждый элемент (x,y) результатов zip(a,b) и сравнить х и у.

Воспроизводимый пример:

>>> a = [20, 35, 226, 62, 129, 108, 156, 225, 115, 35, 162, 43, 9, 120, 181, 220
>>> b = [1, 35, 69, 103, 137, 171, 205, 239, 18, 52, 86, 120, 154, 188, 222, 240
>>> zip(a,b)
[(20, 1), (35, 35), (226, 69), (62, 103), (129, 137), (108, 171), (156, 205), (2
>>> [x for x,y in zip(a,b) if x == y ]
[35]
>>>
Другие вопросы по тегам