diff --git a/src/array/methods.jl b/src/array/methods.jl index 7f6193c24..95544d3ce 100644 --- a/src/array/methods.jl +++ b/src/array/methods.jl @@ -280,6 +280,30 @@ function _cat(catdim::Union{Int,Symbol,DimOrDimType}, A1::AbstractDimArray, As:: end function _cat(catdims::Tuple, A1::AbstractDimArray, As::AbstractDimArray...) Xin = (A1, As...) + newcatdims = _catdims(catdims, A1, As...) + inserted_dims = dims(newcatdims, dims(A1)) + appended_dims = otherdims(newcatdims, inserted_dims) + + inserted_dnums = dimnum(A1, inserted_dims) + appended_dnums = ntuple(i -> i + length(dims(A1)), length(appended_dims)) + cat_dnums = (inserted_dnums..., appended_dnums...) + + # Warn if dims or val do not match, and cat the parent + if !comparedims(map(x -> otherdims(x, newcatdims), Xin)...; + order=true, val=true, msg=Dimensions.Warn(" Can't `cat` AbstractDimArray, applying to `parent` object.") + ) + return Base.cat(map(parent, Xin)...; dims=cat_dnums) + end + + updated_dims = setdims(dims(A1), inserted_dims) + newdims = (updated_dims..., appended_dims...) + newrefdims = otherdims(refdims(A1), newcatdims) + newA = Base.cat(map(parent, Xin)...; dims=cat_dnums) + return rebuild(A1, newA, format(newdims, newA), newrefdims) +end + +function _catdims(catdims, As...) + A1 = first(As) newcatdims = map(catdims) do catdim # If catdim is already constructed, its the new dimension if catdim isa Dimension @@ -296,13 +320,13 @@ function _cat(catdims::Tuple, A1::AbstractDimArray, As::AbstractDimArray...) catdim = basedims(name2dim(catdim)) end # Dimension Types and Symbols - if all(x -> hasdim(x, catdim), Xin) + if all(x -> hasdim(x, catdim), As) # We concatenate an existing dimension newcatdim = if lookup(A1, catdim) isa NoLookup rebuild(catdim, NoLookup()) else - # vcat the index for the catdim in each of Xin - joindims = map(A -> dims(A, catdim), Xin) + # vcat the index for the catdim in each of As + joindims = map(A -> dims(A, catdim), As) if !check_cat_lookups(joindims...) return rebuild(catdim, NoLookup()) end @@ -310,13 +334,13 @@ function _cat(catdims::Tuple, A1::AbstractDimArray, As::AbstractDimArray...) end else # Concatenate new dims - if all(map(x -> hasdim(refdims(x), catdim), Xin)) + if all(map(x -> hasdim(refdims(x), catdim), As)) if catdim isa Dimension && val(catdim) isa AbstractArray && !(lookup(catdim) isa NoLookup{AutoValues}) # Combine the refdims properties with the passed in catdim - set(refdims(first(Xin), catdim), catdim) + set(refdims(first(As), catdim), catdim) else # vcat the refdims - _vcat_dims(map(x -> refdims(x, catdim), Xin)...) + _vcat_dims(map(x -> refdims(x, catdim), As)...) end else # Use the catdim as the new dimension @@ -324,26 +348,7 @@ function _cat(catdims::Tuple, A1::AbstractDimArray, As::AbstractDimArray...) end end end - - inserted_dims = dims(newcatdims, dims(A1)) - appended_dims = otherdims(newcatdims, inserted_dims) - - inserted_dnums = dimnum(A1, inserted_dims) - appended_dnums = ntuple(i -> i + length(dims(A1)), length(appended_dims)) - cat_dnums = (inserted_dnums..., appended_dnums...) - - # Warn if dims or val do not match, and cat the parent - if !comparedims(map(x -> otherdims(x, newcatdims), Xin)...; - order=true, val=true, msg=Dimensions.Warn(" Can't `cat` AbstractDimArray, applying to `parent` object.") - ) - return Base.cat(map(parent, Xin)...; dims=cat_dnums) - end - - updated_dims = setdims(dims(A1), inserted_dims) - newdims = (updated_dims..., appended_dims...) - newrefdims = otherdims(refdims(A1), newcatdims) - newA = Base.cat(map(parent, Xin)...; dims=cat_dnums) - return rebuild(A1, newA, format(newdims, newA), newrefdims) + return newcatdims end function Base.hcat(As::Union{AbstractDimVector,AbstractDimMatrix}...) diff --git a/src/stack/methods.jl b/src/stack/methods.jl index 7e684ba84..a50138c86 100644 --- a/src/stack/methods.jl +++ b/src/stack/methods.jl @@ -114,7 +114,9 @@ cat(stacks...; keys=(:sea_surface_temp, :humidity), dims=Ti) ``` """ function Base.cat(s1::AbstractDimStack, stacks::AbstractDimStack...; keys=keys(s1), dims) - vals = Tuple(cat((s[k] for s in (s1, stacks...))...; dims) for k in keys) + dims = dims isa Tuple ? dims : (dims,) + catdims = _catdims(dims, s1, stacks...) + vals = Tuple(cat((s[k] for s in (s1, stacks...))...; dims = catdims) for k in keys) rebuild_from_arrays(s1, vals) end