In a sense, I am looking for a workaround for #16606: for functions which return an array, I would like to keep it as is, but for functions which return a scalar, I would like to drop the relevant dimension. I can’t just apply dropdims
automatically, eg
using Statistics
R = randn(100, 5)
mapslices(col -> quantile(col, [0.25, 0.5, 0.75]), R; dims = 1) # size (3, 5), OK
mapslices(col -> quantile(col, [0.5]), R; dims = 1) # size (1, 5), OK
mapslices(mean, R; dims = 1) # size (1, 5), I want (5, )
1 Like
On Julia 1.1, you can use map(mean, eachslice(R, dims=1))
. Now, that won’t do the concatenating behavior in the other cases (it’ll make an array of arrays), but I find that much easier to reason about.
4 Likes
This answer is incorrect. The functions mapslices
and eachslice
seem to work differently (and inconsistently?). Note how I need to change dimension to obtain the same result.
julia> mat = rand(3,4);
julia> map(sum , eachslice(mat ; dims=1))
3-element Array{Float64,1}:
2.2826198339269235
2.681128756495633
2.108886303861928
julia> dropdims(mapslices(sum, mat ; dims=2); dims = 2 )
3-element Array{Float64,1}:
2.2826198339269235
2.681128756495633
2.108886303861928
In case of arrays of 3 dimensions or more, I am not sure it’s possible to find the equivalent form of eachslice.
1 Like
For doing many dimensions you may want JuliennedArrays, which appears to follow the convention of mapslices
:
julia> using JuliennedArrays
julia> map(sum, Slices(mat, 2)) == map(sum, eachslice(mat; dims=1))
true
julia> map(sum, Slices(rand(10,20,30,40), 1,3)) |> size
(20, 40)
2 Likes