html_url,issue_url,id,node_id,user,created_at,updated_at,author_association,body,reactions,performed_via_github_app,issue
https://github.com/pydata/xarray/issues/4417#issuecomment-1245036513,https://api.github.com/repos/pydata/xarray/issues/4417,1245036513,IC_kwDOAMm_X85KNb_h,3958036,2022-09-13T07:54:32Z,2022-09-13T07:54:32Z,CONTRIBUTOR,"Thanks @benbovy - with explicit methods now to produce the result with or without index, I think we can close this now :smiley: ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,698577111
https://github.com/pydata/xarray/issues/4417#issuecomment-1239064150,https://api.github.com/repos/pydata/xarray/issues/4417,1239064150,IC_kwDOAMm_X85J2p5W,4160723,2022-09-07T08:18:08Z,2022-09-07T08:18:08Z,MEMBER,"From discussions in #4825 and elsewhere (e.g., https://github.com/pydata/xarray/issues/6607#issuecomment-1126587818), could we say that we're going towards a consensus that the index vs. coordinate API should be decoupled wherever possible?
If that's the case, then `set_coords()` shouldn't create any index, but it could be chained with `set_index()` if necessary (or `swap_dims()` can be used instead).
Apparently `set_coords()` never created an index? I tested @johnomotani's example back to v0.14. Before v2022.6.0, there was a source of confusion where the `Dataset` and `DataArray` reprs still showed an `*` for the dimension coordinate while it had no index. This is fixed in v2022.6.0 where the reprs are now consistent: no `*` and no index. Does this solve the issue here?
@johnomotani from your example it looks like the two alternatives below would produce the desired result with v2022.6.0:
- `ds.set_index(x='b')`
- `ds.rename(b='x').set_coords('x').set_index(x='x')`
I would encourage using the latter. It is more verbose but clearer (each method is explicit).
Note also that Xarray now also supports non-dimension coordinates with an index. Once #6971 is merged, renaming ""b"" to ""x"" won't be needed. Instead you'll be able to do something like:
```
ds = xr.Dataset()
ds['a'] = ('x', np.linspace(0,1))
ds['b'] = ('x', np.linspace(3,4))
ds = ds.set_coords('b').set_xindex('b')
ds.sel(b=...)
```
","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,698577111
https://github.com/pydata/xarray/issues/4417#issuecomment-691109135,https://api.github.com/repos/pydata/xarray/issues/4417,691109135,MDEyOklzc3VlQ29tbWVudDY5MTEwOTEzNQ==,3958036,2020-09-11T13:54:01Z,2020-09-11T13:54:01Z,CONTRIBUTOR,"> I think I was trying to fix this in #4108
:+1: On a quick glance it looks to me like #4108 would fix my issue here.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,698577111
https://github.com/pydata/xarray/issues/4417#issuecomment-691099568,https://api.github.com/repos/pydata/xarray/issues/4417,691099568,MDEyOklzc3VlQ29tbWVudDY5MTA5OTU2OA==,2448579,2020-09-11T13:36:34Z,2020-09-11T13:36:34Z,MEMBER,I think I was trying to fix this in #4108,"{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,698577111
https://github.com/pydata/xarray/issues/4417#issuecomment-691045790,https://api.github.com/repos/pydata/xarray/issues/4417,691045790,MDEyOklzc3VlQ29tbWVudDY5MTA0NTc5MA==,3958036,2020-09-11T11:45:40Z,2020-09-11T11:45:40Z,CONTRIBUTOR,"I haven't managed to get `set_index` to line up the results. This:
```
import numpy as np
import xarray as xr
ds = xr.Dataset()
ds['a'] = ('x', np.linspace(0,1))
ds['b'] = ('x', np.linspace(3,4))
ds = ds.rename(b='x')
ds = ds.set_coords('x')
ds = ds.set_index(x='x')
print(ds)
print('indexes', ds.indexes)
```
Produces a Dataset that now has an index `x`, but no `x` coordinate. The 'assignment of 1D variable' version produces both a coordinate and an index.
One suggested solution in #2461 was to use `swap_dims()`, and the following does produce the desired result
```
import numpy as np
import xarray as xr
ds = xr.Dataset()
ds['a'] = ('x', np.linspace(0,1))
ds['b'] = ('x', np.linspace(3,4))
ds = ds.swap_dims({'x': 'b'})
ds = ds.rename(b='x')
print(ds)
print('indexes', ds.indexes)
```
But (1) having to use `swap_dims()` to create a coordinate seems bizarre, (2) I think it's a bit ugly to get rid of the `x` dimension with `swap_dims()`, and then have to rename the new dimension back to `x`, when what I wanted was to add a coordinate to `x`.
I found the behaviour confusing because I wasn't aware of the index variables at all... I create a coordinate with `set_coords()`; then do a bunch of manipulations involving slicing pieces out of the Dataset and re-combining them with `concat` (at least I think this is the relevant part of my code...); finally test the result by taking slices again (with `isel()`) of the result and comparing them to slices of the original Dataset with `xarray.testing.assert_identical()`, which failed because of the missing indexes. I guess somewhere in the manipulations I did, some operation created the coordinate in a new Dataset object by assignment, at which point it generated an index for the coordinate too.
I may well be missing other context that makes this an undesirable thing to do, but for my use-case at least, I think it would make more sense if `set_coords()` created an index if the coordinate is a dimension coordinate (or whatever the actual criterion is for assignment of a 1d variable to create an index).","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,698577111
https://github.com/pydata/xarray/issues/4417#issuecomment-690815529,https://api.github.com/repos/pydata/xarray/issues/4417,690815529,MDEyOklzc3VlQ29tbWVudDY5MDgxNTUyOQ==,5635139,2020-09-11T01:17:42Z,2020-09-11T01:17:42Z,MEMBER,"Thanks for the clear example @johnomotani !
IIRC, the second creates an index because `ds['x'] = ('x', np.linspace(3,4))` is setting a 1D variable where the name of the variable matches the name of its dimension.
I can see why this is a bit confusing, though it's not an unreasonable default imo. There have been some discussions on this on the issue tracker.
Does `ds.set_index(x='b')` align the examples? Or do you think there's still some confusion from the API?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,698577111