одинаковые элементы векторов Numpy

Имеется два вектора разной длины с неповторяющимися значениями в каждом векторе. Нужно получить значения, которые имеются одновременно в обоих векторах

a = np.array((1, 2, 5))
b = np.array((2, 3, 5, 10, 20))

Правильный результат:

array([2, 5])

Ответы (2 шт):

Автор решения: MarianD
result = np.array(set(a).intersection(b))

Объяснение:

  1. set(a) создает из поля а множество.
  2. На это множество применим метод intersection(b), который сделает его пересечение с полем b (автоматически конвертированном тоже на множество).
  3. Затем из этого пересечения сделаем обратно поле NumPy.
→ Ссылка
Автор решения: CrazyElf

Есть специальный метод для этого в Numpy:

c = np.intersect1d(a, b)

При работе с массивами Numpy лучше пользоваться его же родными методами, обычно это будет эффективнее, чем работа в чистом Python.

P.S. Странно, но в Google Colab получается, что чистый питон всё же быстрее. Загадочно )

%timeit c = np.intersect1d(a, b)
%timeit result = np.array(set(a).intersection(b))

Вывод:

The slowest run took 10.96 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 5: 19.6 µs per loop
The slowest run took 12.82 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 5: 3.02 µs per loop

P.P.S. А, ну как обычно дело в размерах. На мелких массивах чистый питон быстрее. На очень больших массивах Numpy рулит.

a = np.random.randint(100_000, size=500_000)
b = np.random.randint(100_000, size=500_000)
%timeit c = np.intersect1d(a, b)
%timeit result = np.array(set(a).intersection(b))

Вывод:

10 loops, best of 5: 119 ms per loop
1 loop, best of 5: 296 ms per loop
→ Ссылка