[proposal] concatenate by axis, ignore dimension names
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 4.2k
- Forks
- 1.4k
- Avg merge
- 2d 15h
- Merged PRs (30d)
- 14
Description
Hi, I wrote a helper function which allows to concatenate arrays like xr.combine_nested with the difference that it only supports xr.DataArrays, concatenates them by axis position similar to np.concatenate and overwrites all dimension names.
I often need this to combine very different feature types.
from typing import Union, Tuple, List
import numpy as np
import xarray as xr
def concat_by_axis(
darrs: Union[List[xr.DataArray], Tuple[xr.DataArray]],
dims: Union[List[str], Tuple[str]],
axis: int = None,
**kwargs
):
"""
Concat arrays along some axis similar to `np.concatenate`. Automatically renames the dimensions to `dims`.
Please note that this renaming happens by the axis position, therefore make sure to transpose all arrays
to the correct dimension order.
:param darrs: List or tuple of xr.DataArrays
:param dims: The dimension names of the resulting array. Renames axes where necessary.
:param axis: The axis which should be concatenated along
:param kwargs: Additional arguments which will be passed to `xr.concat()`
:return: Concatenated xr.DataArray with dimensions `dim`.
"""
# Get depth of nested lists. Assumes `darrs` is correctly formatted as list of lists.
if axis is None:
axis = 0
l = darrs
# while l is a list or tuple and contains elements:
while isinstance(l, List) or isinstance(l, Tuple) and l:
# increase depth by one
axis -= 1
l = l[0]
if axis == 0:
raise ValueError("`darrs` has to be a (possibly nested) list or tuple of xr.DataArrays!")
to_concat = list()
for i, da in enumerate(darrs):
# recursive call for nested arrays;
# most inner call should have axis = -1,
# most outer call should have axis = - depth_of_darrs
if isinstance(da, list) or isinstance(da, tuple):
da = concat_axis(da, dims=dims, axis=axis + 1, **kwargs)
if not isinstance(da, xr.DataArray):
raise ValueError("Input %d must be a xr.DataArray" % i)
if len(da.dims) != len(dims):
raise ValueError("Input %d must have the same number of dimensions as specified in the `dims` argument!" % i)
# force-rename dimensions
da = da.rename(dict(zip(da.dims, dims)))
to_concat.append(da)
return xr.concat(to_concat, dim=dims[axis], **kwargs)
Would it make sense to include this in xarray?
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reviewing the existing xr.combine_nested and xr.concat APIs and how they handle DataArrays, dimensions, and axis positions. Compare the proposed behavior for nested inputs, forced dimension renaming, and concatenation with the current interfaces; done means a settled API decision and an implementation path with matching tests.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- numpy, python
- Domain
- data
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 30/100