pydata / pydata/xarray

Concat doesn't concatenate dimension coordinates along new dims

Open
#7,539 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

API design topic-indexing
Dominant language
Python
Stars
4.2k
Forks
1.4k
Avg merge
2d 15h
Merged PRs (30d)
14

Description

What is your issue?

xr.concat doesn't concatenate dimension coordinates along new dimensions, which leads to pretty unintuitive behavior.

Take this example (motivated by https://github.com/pydata/xarray/discussions/7532#discussioncomment-4988792)

segments = []
for i in range(2):
    time = np.sort(np.random.random(4))
    da = xr.DataArray(
        np.random.randn(4,2),
        dims=["time", "cols"],
        coords=dict(time=('time', time), cols=["col1", "col2"]),
        )
    segments.append(da)
In [86]: segments
Out[86]: 
[<xarray.DataArray (time: 4, cols: 2)>
 array([[-0.61199576, -0.9012078 ],
        [-0.54187577,  1.30509994],
        [-3.53720471,  0.97607797],
        [ 0.2593455 ,  0.95920031]])
 Coordinates:
   * time     (time) float64 0.1048 0.168 0.869 0.9432
   * cols     (cols) <U4 'col1' 'col2',
 <xarray.DataArray (time: 4, cols: 2)>
 array([[ 0.90266408, -0.54294821],
        [-1.09087103, -0.17484417],
        [-0.21679558, -0.57377412],
        [ 0.07570151,  0.27433728]])
 Coordinates:
   * time     (time) float64 0.03627 0.09754 0.2434 0.592
   * cols     (cols) <U4 'col1' 'col2']
In [85]: xr.concat(segments, dim='new')
Out[85]: 
<xarray.DataArray (new: 2, time: 8, cols: 2)>
array([[[        nan,         nan],
        [        nan,         nan],
        [-0.61199576, -0.9012078 ],
        [-0.54187577,  1.30509994],
        [        nan,         nan],
        [        nan,         nan],
        [-3.53720471,  0.97607797],
        [ 0.2593455 ,  0.95920031]],

       [[ 0.90266408, -0.54294821],
        [-1.09087103, -0.17484417],
        [        nan,         nan],
        [        nan,         nan],
        [-0.21679558, -0.57377412],
        [ 0.07570151,  0.27433728],
        [        nan,         nan],
        [        nan,         nan]]])
Coordinates:
  * time     (time) float64 0.03627 0.09754 0.1048 0.168 ... 0.592 0.869 0.9432
  * cols     (cols) <U4 'col1' 'col2'
Dimensions without coordinates: new

I would have expected to get a result of size {new: 2, time: 4, cols: 2}. That would be intuitive, because the default is coords='different', and that would be the result of concatenating each time coordinate (which have different values) and just propagating the cols coordinate (as they have the same values).

Instead what happened is that xr.concat treats the dimension coordinates as indexes to align, and defaults to an outer join. This auto-alignment behaviour has been discussed at length before, I'm just trying to point out another place in which its problematic.

This is kind of briefly mentioned in the concat docstring under coords='all':

“all”: All coordinate variables will be concatenated, except those corresponding to other dimensions.

but it's not even mentioned under coords='different'

I don't really know what I would prefer to happen with the coordinates. I guess to have created a time coordinate of size {new: 2, time: 4, cols: 2}, but then I don't know what that implies for the underlying index. @benbovy do you have any thoughts?

At the very least we should make this a lot clearer in the docs.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the xr.concat docstring and the provided example, then inspect the concat documentation for coords='different' and coords='all'. Update the docs to clearly explain how dimension coordinates are handled and how alignment affects the result, including the behavior shown in the example.

Written by the indexing model from the issue text.

Assessment

Tech stack
numpy, python
Domain
data, documentation
Issue type
Documentation
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.