Предположим, у меня есть пример массива numpy
:
import numpy as np
X = np.array([2,5,0,4,3,1])
И у меня также есть список массивов, например:
A = [np.array([-2,0,2]), np.array([0,1,2,3,4,5]), np.array([2,5,4,6])]
Я хочу оставить только эти элементы каждого списка, который также находится в X. Я ожидаю, что это также будет сделано наиболее эффективным / обычным способом.
Решение, которое я пробовал до сих пор:
- Сортировка
X
X.sort()
. Найти расположение элементов каждого массива в X
, используя:
locations = [np.searchsorted(X, n) for n in A]
Оставить только нужные:
masks = [X[locations[i]] == A[i] for i in range(len(A))]
result = [A[i][masks[i]] for i in range(len(A))]
Но это не работает, поскольку местоположения третьего массива выходят за пределы:
locations = [array([0, 0, 2], dtype=int64), array([0, 1, 2, 3, 4, 5], dtype=int64), array([2, 5, 4, 6], dtype=int64)]
Как решить эту проблему?
Обновление
Я получил решение idx[idx==len(Xs)] = 0
. Я также заметил два разных подхода к ответам: преобразование X
в set
против np.sort
. У обоих из них есть свои плюсы и минусы: set
операции используют итерации, которые довольно медленные по сравнению с numpy
методами; однако np.searchsorted
скорость увеличивается логарифмически в отличие от принятия set
предметов, что мгновенно. Поэтому я решил сравнить производительность, используя данные огромных размеров, особенно 1 миллион элементов для X, A[0], A[1], A[2]
.