pydata / pydata/xarray

Unstack non-index coordinate

Open
#4,397 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

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

Description

What happened:

Non-indexed coordinates are not unstacked correctly. The example below should be self-explanatory.

In the example below, I create a surface of the torus which should be used for some calculation for each point - therefore I have to use multi-index. The surface is given by the set of (R, Z) -- indexed by pol_idx -- which is the same for each toroidal angle phi. At the end of the day I would like to have the mesh of ('phi', 'pol_idx').

What you expected to happen:

ds.stack(multiindex=("a", "b")).unstack("multindex")should returnds`.

Minimal Complete Verifiable Example:

theta = np.linspace(0, np.pi)
R0 = 1

grid = xr.Dataset(coords={"R": ("pol_idx", R0 * np.cos(theta)), 
                          "Z": ("pol_idx", R0 * np.sin(theta)), 
                          "phi": np.linspace(0, 2*np.pi, N_phi_points, endpoint=False)})
> <xarray.Dataset>
> Dimensions:  (phi: 256, pol_idx: 50)
> Coordinates:
>    R        (pol_idx) float64 1.0 0.9979 0.9918 0.9816 ... -0.9918 -0.9979 -1.0
>    Z        (pol_idx) float64 0.0 0.06407 0.1279 ... 0.1279 0.06407 1.225e-16
>  * phi      (phi) float64 0.0 0.02454 0.04909 0.07363 ... 6.21 6.234 6.259
> Dimensions without coordinates: pol_idx
> Data variables:
>   *empty*

grid = grid.stack(index=("pol_idx", "phi"))

> <xarray.Dataset>
> Dimensions:  (index: 12800)
> Coordinates:
>     R        (index) float64 1.0 1.0 1.0 1.0 1.0 ... -1.0 -1.0 -1.0 -1.0 -1.0
>     Z        (index) float64 0.0 0.0 0.0 0.0 ... 1.225e-16 1.225e-16 1.225e-16
>   * index    (index) MultiIndex
>   - pol_idx  (index) int64 0 0 0 0 0 0 0 0 0 0 ... 49 49 49 49 49 49 49 49 49 49
>   - phi      (index) float64 0.0 0.02454 0.04909 0.07363 ... 6.21 6.234 6.259
> Data variables:
>     *empty*

# Here I would like to perform some calculation on the prepared grid over the multiindex.

grid = grid.unstack("index")

> <xarray.Dataset>
> Dimensions:  (phi: 256, pol_idx: 50)
> Coordinates:
>   R        (pol_idx, phi) float64 1.0 1.0 1.0 1.0 1.0 ... -1.0 -1.0 -1.0 -1.0
>   Z        (pol_idx, phi) float64 0.0 0.0 0.0 ... 1.225e-16 1.225e-16
>  * pol_idx  (pol_idx) int64 0 1 2 3 4 5 6 7 8 9 ... 41 42 43 44 45 46 47 48 49
>   * phi      (phi) float64 0.0 0.02454 0.04909 0.07363 ... 6.21 6.234 6.259
> Data variables:
>     *empty*

Comment:

I am not sure whether this is a bug. However, I find this behaviour counterintuitive.

Environment:

Output of xr.show_versions() INSTALLED VERSIONS ------------------ commit: None python: 3.7.4 (default, Aug 13 2019, 20:35:49) [GCC 7.3.0] python-bits: 64 OS: Linux OS-release: 4.15.0-112-generic machine: x86_64 processor: x86_64 byteorder: little LC_ALL: None LANG: en_US.UTF-8 LOCALE: en_US.UTF-8 libhdf5: 1.10.4 libnetcdf: 4.6.1

xarray: 0.14.1
pandas: 0.25.1
numpy: 1.17.2
scipy: 1.3.1
netCDF4: 1.4.2
pydap: None
h5netcdf: 0.7.4
h5py: 2.9.0
Nio: None
zarr: None
cftime: 1.0.4.2
nc_time_axis: None
PseudoNetCDF: None
rasterio: None
cfgrib: None
iris: None
bottleneck: 1.2.1
dask: 2.5.2
distributed: 2.5.2
matplotlib: 3.1.3
cartopy: None
seaborn: 0.9.0
numbagg: None
setuptools: 41.4.0
pip: 19.2.3
conda: 4.8.3
pytest: 5.2.1
IPython: 7.8.0
sphinx: 2.2.0

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

No files or tests are named. Start by running the provided xarray stack/unstack example and compare the original coordinates with the unstacked result; done means unstack restores the non-indexed R and Z coordinates without changing their intended dimensions.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
data
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.