Поиск индекса элементов в массиве / списке на основе другого списка или массива - PullRequest
2 голосов
/ 06 февраля 2020

У меня есть два списка / массива, я хочу найти индекс элементов в одном списке, если такое же число существует в другом списке. Вот пример

 list_A = [1,7,9,7,11,1,2,3,6,4,9,0,1]
 list_B = [9,1,7] 
 #output required : [0,1,2,3,5,10,12]

Любой способ сделать это с надеждой numpy

1 Ответ

3 голосов
/ 06 февраля 2020

Использование списка-понимания и enumerate():

>>> list_A = [1,7,9,7,11,1,2,3,6,4,9,0,1]
>>> list_B = [9,1,7]
>>> [i for i, x in enumerate(list_A) if x in list_B]
[0, 1, 2, 3, 5, 10, 12]

Использование numpy:

>>> import numpy as np
>>> np.where(np.isin(list_A, list_B))
(array([ 0,  1,  2,  3,  5, 10, 12], dtype=int64),)

Кроме того, как @ Chris_Rands указывает, что мы также можем сначала преобразовать list_B в набор, поскольку in - это O (1) для наборов, а не O (n) для списков.

Время сравнение:

import random
import numpy as np
import timeit

list_A = [random.randint(0,100000) for _ in range(100000)]
list_B = [random.randint(0,100000) for _ in range(50000)]

array_A = np.array(A)
array_B = np.array(B)

def lists_enumerate(list_A, list_B):
    return [i for i, x in enumerate(list_A) if x in set(list_B)]

def listB_to_set_enumerate(list_A, list_B):
    set_B = set(list_B)
    return [i for i, x in enumerate(list_A) if x in set_B]

def numpy(array_A, array_B):
    return np.where(np.isin(array_A, array_B))

Результаты:

>>> %timeit lists_enumerate(list_A, list_B)
48.8 s ± 638 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> %timeit listB_to_set_enumerate(list_A, list_B)
11.2 ms ± 856 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
>>> %timeit numpy(array_A, array_B)
23.3 ms ± 167 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Очевидно, что для больших списков лучшим решением будет преобразование list_B в набор перед применяя перечисление, или используйте numpy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...