У меня есть два массива, 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
Как насчет
numpy.nonzero(numpy.in1d(a2, a1))[0]
Это должно быть быстро. Из моего базового тестирования, это примерно в 7 раз быстрее, чем ваш второй фрагмент кода для len(a2) == 100
, len(a1) == 10000
, и только один общий элемент в индексе 45. Это предполагает, что и a1
, и a2
не имеют повторяющихся элементов.
как насчет:
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» способ сделать это, но именно так я бы сделал это в чистом питоне.