Description
What happened:
When setting a DataArray with loc
, xarray converts bool masks to the coord data type. Therefore loc
does not use a boolean mask but tries to match the indexes of the coord.
Minimal Complete Verifiable Example:
import numpy as np
import xarray as xr
x = np.arange(10).astype(np.float64)
fx = np.arange(10).astype(np.float64)
da = xr.DataArray(fx,dims=['x'],coords={'x':x})
mask = np.zeros((10,))
mask[1::2] = 1
mask = mask.astype(bool)
da.loc[{'x':~mask}] = np.arange(5)+10
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/matthmey/miniconda3/envs/analytics/lib/python3.7/site-packages/xarray/core/dataarray.py", line 214, in __setitem__
self.data_array[pos_indexers] = value
File "/home/matthmey/miniconda3/envs/analytics/lib/python3.7/site-packages/xarray/core/dataarray.py", line 767, in __setitem__
self.variable[key] = value
File "/home/matthmey/miniconda3/envs/analytics/lib/python3.7/site-packages/xarray/core/variable.py", line 854, in __setitem__
indexable[index_tuple] = value
File "/home/matthmey/miniconda3/envs/analytics/lib/python3.7/site-packages/xarray/core/indexing.py", line 1164, in __setitem__
array[key] = value
ValueError: shape mismatch: value array of shape (5,) could not be broadcast to indexing result of shape (10,)
Anything else we need to know?:
Could be fixed by replacing the line, but maybe this is not the cleanest solution. I tried fixing it with the following, which works for the above code but fails for other cases.
if label.dtype != np.bool:
label = maybe_cast_to_coords_dtype(label, coord.dtype)
Environment:
Output of xr.show_versions()
INSTALLED VERSIONS
commit: None
python: 3.7.0 (default, Oct 9 2018, 10:31:47)
[GCC 7.3.0]
python-bits: 64
OS: Linux
OS-release: 5.4.0-80-lowlatency
machine: x86_64
processor: x86_64
byteorder: little
LC_ALL: None
LANG: en_US.UTF-8
LOCALE: ('en_US', 'UTF-8')
libhdf5: None
libnetcdf: None
xarray: 0.19.0
pandas: 1.0.1
numpy: 1.18.1
scipy: 1.4.1
netCDF4: None
pydap: None
h5netcdf: None
h5py: None
Nio: None
zarr: 2.5.0
cftime: None
nc_time_axis: None
PseudoNetCDF: None
rasterio: None
cfgrib: None
iris: None
bottleneck: None
dask: 2.14.0
distributed: None
matplotlib: 3.1.3
cartopy: None
seaborn: None
numbagg: None
pint: None
setuptools: 46.1.3.post20200330
pip: 20.0.2
conda: None
pytest: None
IPython: 7.13.0
sphinx: None