xarray icon indicating copy to clipboard operation
xarray copied to clipboard

Raise nicer error if passing a list of dimension names to transpose

Open fabienpaulot opened this issue 3 years ago • 5 comments

What happened?

Hello,

in xarray 0.20.1, I am getting the following error

ds = xr.Dataset({"foo": (("x", "y", "z"), [[[42]]]), "bar": (("y", "z"), [[24]])})

ds.transpose("y", "z", "x")

868 """Depending on the setting of missing_dims, drop any dimensions from supplied_dims that
    869 are not present in dims.
    870 
   (...)
    875 missing_dims : {"raise", "warn", "ignore"}
    876 """
    878 if missing_dims == "raise":
--> 879     supplied_dims_set = {val for val in supplied_dims if val is not ...}
    880     invalid = supplied_dims_set - set(dims)
    881     if invalid:

TypeError: unhashable type: 'list'

What did you expect to happen?

The expected result is

ds.transpose("y", "z", "x")

<xarray.Dataset>
Dimensions:  (x: 1, y: 1, z: 1)
Dimensions without coordinates: x, y, z
Data variables:
    foo      (y, z, x) int64 42
    bar      (y, z) int64 24

Minimal Complete Verifiable Example

No response

Relevant log output

No response

Anything else we need to know?

No response

Environment

INSTALLED VERSIONS

commit: None python: 3.9.12 (main, Apr 5 2022, 06:56:58) [GCC 7.5.0] python-bits: 64 OS: Linux OS-release: 3.10.0-1160.42.2.el7.x86_64 machine: x86_64 processor: x86_64 byteorder: little LC_ALL: None LANG: en_US LOCALE: ('en_US', 'ISO8859-1') libhdf5: 1.12.1 libnetcdf: 4.8.1

xarray: 0.20.1 pandas: 1.4.1 numpy: 1.21.5 scipy: 1.8.0 netCDF4: 1.5.7 pydap: None h5netcdf: 999 h5py: 3.6.0 Nio: None zarr: None cftime: 1.5.1.1 nc_time_axis: 1.4.0 PseudoNetCDF: None rasterio: None cfgrib: None iris: None bottleneck: 1.3.4 dask: 2022.02.1 distributed: 2022.2.1 matplotlib: 3.5.1 cartopy: 0.18.0 seaborn: 0.11.2 numbagg: None fsspec: 2022.02.0 cupy: None pint: 0.18 sparse: 0.13.0 setuptools: 61.2.0 pip: 21.2.4 conda: None pytest: None IPython: 8.2.0 sphinx: None

fabienpaulot avatar Apr 20 '22 14:04 fabienpaulot

I can't reproduce on our dev branch. Can you try upgrading xarray please?

EDIT: can't reproduce on 2022.03.0 either.

dcherian avatar Apr 20 '22 14:04 dcherian

Thanks. I upgraded to 2022.03.0

I am still getting the error

Python 3.9.12 (main, Apr  5 2022, 06:56:58) 
[GCC 7.5.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import xarray as xr
>>> xr.__version__
'2022.3.0'
>>> ds = xr.Dataset({"foo": (("x", "y", "z"), [[[42]]]), "bar": (("y", "z"), [[24]])})
>>> ds.transpose(['y','z','y'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/nbhome/f1p/miniconda3/envs/f1p_gfdl/lib/python3.9/site-packages/xarray/core/dataset.py", line 4650, in transpose
    _ = list(infix_dims(dims, self.dims, missing_dims))
  File "/nbhome/f1p/miniconda3/envs/f1p_gfdl/lib/python3.9/site-packages/xarray/core/utils.py", line 786, in infix_dims
    existing_dims = drop_missing_dims(dims_supplied, dims_all, missing_dims)
  File "/nbhome/f1p/miniconda3/envs/f1p_gfdl/lib/python3.9/site-packages/xarray/core/utils.py", line 874, in drop_missing_dims
    supplied_dims_set = {val for val in supplied_dims if val is not ...}
  File "/nbhome/f1p/miniconda3/envs/f1p_gfdl/lib/python3.9/site-packages/xarray/core/utils.py", line 874, in <setcomp>
    supplied_dims_set = {val for val in supplied_dims if val is not ...}
TypeError: unhashable type: 'list'

fabienpaulot avatar Apr 20 '22 14:04 fabienpaulot

ds.transpose(['y','z','y'])

Ah... Reemove the list here and try ds.transpose("y", "z", x") (no list) which is what you have in the first post.

dcherian avatar Apr 20 '22 14:04 dcherian

Oh... I am so sorry about this. This works as expected now. It's weird that using list seemed to have worked at some point. Thanks a lot for your help

fabienpaulot avatar Apr 20 '22 14:04 fabienpaulot

I think we should raise a nicer error message. Transpose is an outlier in our API. In nearly every other function, you are expected to pass a list of dimension names.

dcherian avatar Apr 20 '22 15:04 dcherian