Issue
I have two arrays, a1 and a2. Assume len(a2) >> len(a1)
, and that a1 is a subset of a2.
I would like a quick way to return the a2 indices of all elements in a1. The time-intensive way to do this is obviously:
from operator import indexOf
indices = []
for i in a1:
indices.append(indexOf(a2,i))
This of course takes a long time where a2 is large. I could also use numpy.where() instead (although each entry in a1 will appear just once in a2), but I'm not convinced it will be quicker. I could also traverse the large array just once:
for i in xrange(len(a2)):
if a2[i] in a1:
indices.append(i)
But I'm sure there is a faster, more 'numpy' way - I've looked through the numpy method list, but cannot find anything appropriate.
Many thanks in advance,
D
Solution
How about
numpy.nonzero(numpy.in1d(a2, a1))[0]
This should be fast. From my basic testing, it's about 7 times faster than your second code snippet for len(a2) == 100
, len(a1) == 10000
, and only one common element at index 45. This assumes that both a1
and a2
have no repeating elements.
Answered By - Alok Singhal
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.