одинаковые элементы векторов 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))
Объяснение:
set(a)создает из поляамножество.- На это множество применим метод
intersection(b), который сделает его пересечение с полемb(автоматически конвертированном тоже на множество). - Затем из этого пересечения сделаем обратно поле 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