Searchsorted with by and lookup

a = [1,3,2,4,1,2,1];
is = sortperm(a);

after this, I’d assume is[searchsorted(is, q, by=x -> a[x])] should work to find indices in a that contain q, however:

a[is[searchsorted(is, 3, by=x -> a[x])]]
2-element Array{Int64,1}:
 2
 2

and similar queries somehow mess up. I might be missing something very simple but i feel quite stuck

works well with searchsorted(a[is], q)

I think that the implementation assumes that modifier keywords don’t break the ordering (otherwise, you can’t use binary search). See ?searchsorted.

Your searchsorted has a by clause, so you’re searching for indices of is that give the same value as 3 after you apply the function x->a[x], i.e. you’re searching for all the indices where a[is]=a[3]=2. This correctly returns the interval 4:5. So

a[is[searchsorted(is, 3, by=x -> a[x])]]=a[is[4:5]]=a[[3,6]]=[2,2]
2 Likes

Oooh. I assumed that the query (x=3 here) does not go through the by function. Thank you.

Is there a built in function with this behavior?

just to share, I found what I wanted, this way, using view:

a = [1,3,2,4,1,2,1];
is = sortperm(a);
va = view(a, is)
a[is[searchsorted(va, 3)]]
1 Like