Suppose I have the Array a=[0.5, 0.6, 0.5, 0.4, 0.5, 0.6] and a reference Array b=[0.4, 0.5, 0.6]. I want to to find the position in b of each element of a. I want then to obtain the output [2, 3, 2, 1, 2, 3]. I tried codes like findfirst.(x-> x in b,a) or findfirst.(x-> x.==b,a) but they don’t work. I didn’t find any satisfactory solution in my seraches and attempts. Any hint, guys?
findfirst.(isequal.(a), (b,)) should work.
julia> map(a) do ai
findfirst(t -> t == ai, b)
end
Gosh! I even tried findfirst(isequal(a),b) but completely forgot the element-wise operations! Didn’t know the , option after b.
Ok
Didn’t know about this application of do.
Just a note on this because it is tricky and does come up. The reason he wrote (b,) is that if you do not wrap the b, Julia tries to also broadcast the findfirst function over b as well. You don’t want that in this case, so you have to “hide” b within something. He put b in a tuple, but you could also use [b] or Ref(b).
That’s just creating a 1-element tuple:
julia> t = (1,)
(1,)
julia> typeof(t)
Tuple{Int64}
You need the , because otherwise (x) is just the same as x.
You can also do Ref(b) instead, since Julia guarantees that a Ref is treated as a scalar in broadcasting.
Gotcha by 2 secs ![]()
Ok, perfect!
Ok got it ![]()
For the curious ones: the goal of the output Array [2, 3, 2, 1, 2, 3] is to apply it to a multidimensional Array like A=rand(5,3,6). I want to select the column 2 in the first element of A, the column 3 in the second element of A and so on
That part of code is ok for me
Just wanted to share the utility of obtaining such an output Array.
There is also indexin(a, b).
OMG! Such a simple solution and command! Didn’t know the existence of this function.
This and invperm I’ve probably re-written with findfirst more often than I remember…
BTW I think indexin may be more efficient if b is large, as it scans just once. But not here.
Ok
Yes, b is not large.
indexin should be the accepted answer! @sergevic can you please change it?
d=Dict(b.=>eachindex(b))
map(e->get(d,e,nothing),a)
PS
![]()