Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

large array searching with numpy

I have a two arrays of integers

a = numpy.array([1109830922873, 2838383, 839839393, ..., 29839933982])
b = numpy.array([2838383, 555555555, 2839474582, ..., 29839933982])

where len(a) ~ 15,000 and len(b) ~ 2 million.

What I want is to find the indices of array b elements which match those in array a. Now, I'm using list comprehension and numpy.argwhere() to achieve this:

bInds = [ numpy.argwhere(b == c)[0] for c in a ]

however, obviously, it is taking a long time to complete this. And array a will become larger too, so this is not a sensible route to take.

Is there a better way to achieve this result, considering the large arrays I'm dealing with here? It currently takes around ~5 minutes to do this. Any speed up is needed!

More info: I want the indices to match the order of array a too. (Thanks Charles)

like image 678
Carl M Avatar asked Aug 05 '26 16:08

Carl M


1 Answers

Unless I'm mistaken, your approach searches the entire array b for each element of a again and again.

Alternatively, you could create a dictionary mapping the individual elements from b to their indices.

indices = {}
for i, e in enumerate(b):
    indices[e] = i                      # if elements in b are unique
    indices.setdefault(e, []).append(i) # otherwise, use lists

Then you can use this mapping for quickly finding the indices where elements from a can be found in b.

bInds = [ indices[c] for c in a ]
like image 179
tobias_k Avatar answered Aug 08 '26 12:08

tobias_k



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!