Найдите расположение (индексы) N элементов в огромном массиве numpy - PullRequest
1 голос
/ 21 июня 2020

У меня есть, скажем, 5 элементов,

[21,103,3,10,243]

и огромный Numpy массив

[4,5,1,3,5,100,876,89,78......456,64,3,21,245]

с 5 элементами, повторяющимися в большом массиве. Я хочу найти все индексы, в которых элементы небольшого списка появляются в большом массиве. Маленький список будет иметь длину менее 100 элементов, а большой список будет иметь длину примерно 10^7 элементов, поэтому скорость здесь имеет значение. Какой самый элегантный и самый быстрый способ сделать это в python3 .x?

Я пробовал использовать np.where(), но он работает очень медленно. Ищете более быстрый способ.

Ответы [ 4 ]

1 голос
/ 21 июня 2020

Чтобы ускорить процесс, вы можете выполнить оптимизацию следующим образом:

  1. Сортировка большего массива
  2. Выполните двоичный поиск (в большем массиве) для каждого числа в меньшем массиве.

Сложность времени

Сортировка с использованием numpy.sort(kind='heapsort') будет иметь сложность времени n*log(n). Бинарный поиск будет иметь сложность log(n) для каждого элемента в меньшем массиве. Если предположить, что в меньшем массиве имеется m элементов, общая сложность поиска будет m*log(n).

В целом это обеспечит вам хорошую оптимизацию.

1 голос
/ 21 июня 2020

Вы можете поместить 100 элементов в таблицу set, a ha sh. Затем l oop через элементы огромного массива, спрашивая, входит ли элемент в набор.

S = set([21,103,3,10,243])
A = [4,5,1,3,5,100,876,89,78......456,64,3,21,245]
result = []
for i,x in enumerate(A):
  if x in S:
    result.append(i)
0 голосов
/ 21 июня 2020
smaller_array = [21,103,3,10,243]

bigger_array = [4,5,1,3,5,100,876,89,78,456,64,3,21,243,243]

print(bigger_array)

print(smaller_array)

for val in smaller_array:

    if val in bigger_array:

        c=0

        try:
            while True:
                c = bigger_array.index(val,c)
                print(f'{val} is found in bigger_array at index {c}')
                c+=1
        except:
            pass
0 голосов
/ 21 июня 2020

меньше_массив = [21,103,3,10,243] больше_массив = [4,5,1,3,5,100,876,89,78,456,64,3,21,243,243] печать (больший_массив) печать (меньший_массив) для val в меньшем_массиве: если вали в большем_массиве: c = больше_массив.index (val), в то время как True: print (f '{val} находится в большем_массиве по индексу {large_array.index (val, c)}') c = large_array.index (val, c) + 1, если val отсутствует в large_array [c:]: break

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