Возвратите индексы общего элемента между двумя массивами numpy

У меня есть два массива, a1 и a2. Принять len(a2) >> len(a1), и это a1 является подмножеством a2.

Я хотел бы быстрый способ возвратить a2 индексы всех элементов в a1. Интенсивный временем способ сделать это, очевидно:

from operator import indexOf
indices = []
for i in a1:
    indices.append(indexOf(a2,i))

Это, конечно, занимает много времени, где a2 является большим. Я мог также использовать numpy.where () вместо этого (хотя каждая запись в a1 появится только однажды в a2), но я не убежден, что это будет более быстро. Я мог также пересечь большой массив только однажды:

for i in xrange(len(a2)):
    if a2[i] in a1:
        indices.append(i)

Но я уверен, что существует более быстрое, больше 'numpy' пути - я просмотрел numpy список методов, но ничто не могу найти соответствующим.

Большое спасибо заранее,

D

12
задан anthares 25 February 2010 в 11:30
поделиться

2 ответа

Как насчет

numpy.nonzero(numpy.in1d(a2, a1))[0]

Это должно быть быстро. Из моего базового тестирования, это примерно в 7 раз быстрее, чем ваш второй фрагмент кода для len(a2) == 100, len(a1) == 10000, и только один общий элемент в индексе 45. Это предполагает, что и a1, и a2 не имеют повторяющихся элементов.

12
ответ дан 2 December 2019 в 20:17
поделиться

как насчет:

wanted = set(a1)
indices =[idx for (idx, value) in enumerate(a2) if value in wanted]

Это должно быть O (len (a1) + len (a2)) вместо O (len (a1) * len ( a2))

NB Я не знаю numpy, поэтому может быть более «numpythonic» способ сделать это, но именно так я бы сделал это в чистом питоне.

2
ответ дан 2 December 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: