Every now and then I need to find the index of the min/max element of a filtered data structure.
I was wondering, how do you normally tackle this quite common problem?
As a first reaction I think of findmin(o, filter(f, data))
but filtering doesn’t hold the original indices.
I ended up using findmin(o, skipmissing([f(d) ? d : misssing for d in data])
where I inject missing
values in the values that should be filtered out.
MWE:
julia> using Random
julia> rng = MersenneTwister(0);
julia> data = [(rand(rng), rand(rng)) for _ in 1:10];
julia> dataobjective(d) = d[2];
julia> filterdata(d) = d[1] > 0.5;
julia> findmin(dataobjective, skipmissing([filterdata(d) ? d : missing for d in data]))
(0.5392892841426182, 6)
It’s very convenient that skipmissing
is propagating the original indices. Is there something like skipfilter
that would do exactly as skipmissing
but for elements satisfying a predicate ?
And how would you solve the above problem ?