[Numpy-discussion] How to find indices of values in an array (indirect in1d) ?

Nicolas P. Rougier Nicolas.Rougier at inria.fr
Wed Dec 30 13:14:46 EST 2015

```Thanks, I will make some benchmark and post results.

> On 30 Dec 2015, at 17:47, Sebastian Berg <sebastian at sipsolutions.net> wrote:
>
> On Mi, 2015-12-30 at 17:12 +0100, Nicolas P. Rougier wrote:
>> Thanks for the quick answers. I think I will go with the .index and
>> list comprehension.
>> But if someone finds with a vectorised solution for the numpy 100
>> exercises...
>>
>
> Yeah, I doubt you can get very pretty, though maybe there is some great
> trick. This is one way:
>
> In [67]: A = np.array([2,0,1,4])
> In [68]: B = np.array([1,2,0])
> In [69]: B_sorter = np.argsort(B)
> In [70]: B_index = np.searchsorted(B, A, sorter=B_sorter)
> In [71]: invalid = B[B_sorter].take(s, mode='clip') != A
> In [72]: B_index[invalid] = -1  # mark invalids with -1
> In [73]: B_index
> Out[73]: array([ 2,  0,  1, -1])
>
> Anyway, I guess the arrays would likely have to be quite large for this
> to beat list comprehension. And maybe doing the searchsorted the other
> way around could be faster, no idea.
>
> - Sebastian
>
>
>>
>> Nicolas
>>
>>
>>> On 30 Dec 2015, at 16:31, Benjamin Root <ben.v.root at gmail.com>
>>> wrote:
>>>
>>> Maybe use searchsorted()? I will note that I have needed to do
>>> something like this once before, and I found that the list
>>> comprehension form of calling .index() for each item was faster
>>> than jumping through hoops to vectorize it using searchsorted
>>> (needing to sort and then map the sorted indices to the original
>>> indices), and was certainly clearer, but that might depend upon the
>>> problem size.
>>>
>>> Cheers!
>>> Ben Root
>>>
>>> On Wed, Dec 30, 2015 at 10:02 AM, Andy Ray Terrel <
>>> andy.terrel at gmail.com> wrote:
>>> Using pandas one can do:
>>>
>>>>>> A = np.array([2,0,1,4])
>>>>>> B = np.array([1,2,0])
>>>>>> s = pd.Series(range(len(B)), index=B)
>>>>>> s[A].values
>>> array([  1.,   2.,   0.,  nan])
>>>
>>>
>>>
>>> On Wed, Dec 30, 2015 at 8:45 AM, Nicolas P. Rougier <
>>> Nicolas.Rougier at inria.fr> wrote:
>>>
>>> I’m scratching my head around a small problem but I can’t find a
>>> vectorized solution.
>>> I have 2 arrays A and B and I would like to get the indices
>>> (relative to B) of elements of A that are in B:
>>>
>>>>>> A = np.array([2,0,1,4])
>>>>>> B = np.array([0,2,0])
>>>>>> print (some_function(A,B))
>>> [1,2,0]
>>>
>>> # A[0] == 2 is in B and 2 == B[1] -> 1
>>> # A[1] == 0 is in B and 0 == B[2] -> 2
>>> # A[2] == 1 is in B and 1 == B[0] -> 0
>>>
>>> Any idea ? I tried numpy.in1d with no luck.
>>>
>>>
>>> Nicolas
>>>
>>> _______________________________________________
>>> NumPy-Discussion mailing list
>>> NumPy-Discussion at scipy.org
>>> https://mail.scipy.org/mailman/listinfo/numpy-discussion
>>>
>>>
>>> _______________________________________________
>>> NumPy-Discussion mailing list
>>> NumPy-Discussion at scipy.org
>>> https://mail.scipy.org/mailman/listinfo/numpy-discussion
>>>
>>>
>>> _______________________________________________
>>> NumPy-Discussion mailing list
>>> NumPy-Discussion at scipy.org
>>> https://mail.scipy.org/mailman/listinfo/numpy-discussion
>>
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion at scipy.org
>> https://mail.scipy.org/mailman/listinfo/numpy-discussion
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> https://mail.scipy.org/mailman/listinfo/numpy-discussion

```