pydata / xarray

N-D labeled arrays and datasets in Python
https://xarray.dev
Apache License 2.0
3.62k stars 1.09k forks source link

ds.coords.dims can display dims not present in the coordinate vars #9466

Open TomNicholas opened 2 months ago

TomNicholas commented 2 months ago

This (on main) looks wrong to me:

In [1]: import xarray as xr

In [2]: ds = xr.Dataset({'a': ('x', [0, 1])})

In [3]: ds
Out[3]: 
<xarray.Dataset> Size: 16B
Dimensions:  (x: 2)
Dimensions without coordinates: x
Data variables:
    a        (x) int64 16B 0 1

In [4]: ds.coords
Out[4]: 
Coordinates:
    *empty*

In [5]: ds.coords.dims
Out[5]: FrozenMappingWarningOnValuesAccess({'x': 2})

I mean the fact no-one has raised this before means it probably isn't of much consequence, but it does seem incorrect / misleading.

_Originally posted by @TomNicholas in https://github.com/pydata/xarray/pull/9451#discussion_r1749072922_

The issue here being that the DatasetCoordinates object displays a dim with no associated variable.

I'm not sure whether anything about the concept of "virtual coordinate variables" affects this.

(The FrozenMappingWarningOnValuesAccess is just a Mapping, it's only weird due to the ongoing deprecation cycle started in #8500.)

shoyer commented 2 months ago

Dimensions part of coordinates, even if they aren't present on coordinate variables -- we need them for correct alignment.

So I think we should add them to the repr instead, ideally something like:

>>> ds.coords
<xarray.Coordinates>
Dimensions:   (x: 2)
Coordinates:
    *empty*
TomNicholas commented 2 months ago

we need them for correct alignment

Can you do xr.align on a ds.coords object?

Also note how similar this question is to #9463...

shoyer commented 2 months ago

Can you do xr.align on a ds.coords object?

Yes, it looks like this works, though I'm a little puzzled by how :)

shoyer commented 2 months ago

Regardless, you definitely need dims + coords (+ indexes) to do alignment. So it makes sense to display them in the Coordinates repr.