Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding eachslice for AbstractDimStack #455

Closed
sethaxen opened this issue Feb 17, 2023 · 3 comments · Fixed by #462
Closed

Adding eachslice for AbstractDimStack #455

sethaxen opened this issue Feb 17, 2023 · 3 comments · Fixed by #462

Comments

@sethaxen
Copy link
Collaborator

sethaxen commented Feb 17, 2023

I know #418 will add post-1.9 support for eachslice(::AbstractDimStack; dims), but I wonder if we could right now add support that would work for pre-1.9:

julia> using DimensionalData

julia> function Base.eachslice(ds::AbstractDimStack; dims)
           slicedims = Dimensions.dims(ds, dims)
           return (view(ds, d...) for d in DimIndices(slicedims))
       end;

julia> ds = DimStack((
           x=DimArray(randn(2, 3, 4), (Dim{:a}(5:6), :b, :c)),
           y=DimArray(randn(2, 3, 5), (Dim{:a}(5:6), :b, :d))
       ));

julia> collect(eachslice(ds; dims=:a))[1] |> refdims
Dim{:a} Sampled{Int64} 5:5 ForwardOrdered Regular Points

julia> collect(eachslice(ds; dims=:a))[2] |> refdims
Dim{:a} Sampled{Int64} 6:6 ForwardOrdered Regular Points

As a bonus, unlike the version in Base, this already supports multiple dimensions.

julia> collect(eachslice(ds; dims=(:a, :b)))[1] |> refdims
Dim{:a} Sampled{Int64} 5:5 ForwardOrdered Regular Points,
Dim{:b}

julia> collect(eachslice(ds; dims=(:a, :b)))[2] |> refdims
Dim{:a} Sampled{Int64} 6:6 ForwardOrdered Regular Points,
Dim{:b}

julia> collect(eachslice(ds; dims=(:a, :b)))[3] |> refdims
Dim{:a} Sampled{Int64} 5:5 ForwardOrdered Regular Points,
Dim{:b}

julia> eachslice(ds; dims=(:a, :b)) |> collect |> size
(2, 3)

julia> eachslice(ds; dims=(:a, :b)) |> collect |> typeof
DimArray{DimStack{NamedTuple{(:x, :y), Tuple{SubArray{Float64, 1, Array{Float64, 3}, Tuple{Int64, Int64, Base.Slice{Base.OneTo{Int64}}}, true}, SubArray{Float64, 1, Array{Float64, 3}, Tuple{Int64, Int64, Base.Slice{Base.OneTo{Int64}}}, true}}}, Tuple{Dim{:c, DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}, Dim{:d, DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}}, Tuple{Dim{:a, DimensionalData.Dimensions.LookupArrays.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}, Dim{:b, DimensionalData.Dimensions.LookupArrays.NoLookup{UnitRange{Int64}}}}, NamedTuple{(:x, :y), Tuple{Tuple{Dim{:c, Colon}}, Tuple{Dim{:d, Colon}}}}, DimensionalData.Dimensions.LookupArrays.NoMetadata, NamedTuple{(:x, :y), Tuple{DimensionalData.Dimensions.LookupArrays.NoMetadata, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}, 2, Tuple{Dim{:a, DimensionalData.Dimensions.LookupArrays.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}, Dim{:b, DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}}, Tuple{}, Matrix{DimStack{NamedTuple{(:x, :y), Tuple{SubArray{Float64, 1, Array{Float64, 3}, Tuple{Int64, Int64, Base.Slice{Base.OneTo{Int64}}}, true}, SubArray{Float64, 1, Array{Float64, 3}, Tuple{Int64, Int64, Base.Slice{Base.OneTo{Int64}}}, true}}}, Tuple{Dim{:c, DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}, Dim{:d, DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}}, Tuple{Dim{:a, DimensionalData.Dimensions.LookupArrays.Sampled{Int64, UnitRange{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}, Dim{:b, DimensionalData.Dimensions.LookupArrays.NoLookup{UnitRange{Int64}}}}, NamedTuple{(:x, :y), Tuple{Tuple{Dim{:c, Colon}}, Tuple{Dim{:d, Colon}}}}, DimensionalData.Dimensions.LookupArrays.NoMetadata, NamedTuple{(:x, :y), Tuple{DimensionalData.Dimensions.LookupArrays.NoMetadata, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}}, DimensionalData.NoName, DimensionalData.Dimensions.LookupArrays.NoMetadata}
@rafaqz
Copy link
Owner

rafaqz commented Feb 18, 2023

Good idea! Thats such a concise implementation.

@sethaxen
Copy link
Collaborator Author

Is there a good reason to not do something similar for AbstractDimArrays? Currently they only support single dimensions.

@rafaqz
Copy link
Owner

rafaqz commented Feb 18, 2023

No I actually assumed you meant both.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants