Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 31 additions & 26 deletions src/array/methods.jl
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,30 @@
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
Expand All @@ -296,54 +320,35 @@
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
_vcat_dims(joindims...)
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)

Check warning on line 340 in src/array/methods.jl

View check run for this annotation

Codecov / codecov/patch

src/array/methods.jl#L340

Added line #L340 was not covered by tests
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
catdim
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}...)
Expand Down
4 changes: 3 additions & 1 deletion src/stack/methods.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Loading