id,node_id,number,title,user,state,locked,assignee,milestone,comments,created_at,updated_at,closed_at,author_association,active_lock_reason,draft,pull_request,body,reactions,performed_via_github_app,state_reason,repo,type 976207971,MDU6SXNzdWU5NzYyMDc5NzE=,5727,Setting item with loc and boolean mask fails,5802846,closed,0,,,3,2021-08-21T19:41:56Z,2022-03-17T17:11:43Z,2022-03-17T17:11:43Z,CONTRIBUTOR,,,,"**What happened**: When setting a DataArray with `loc`, [xarray converts bool masks to the coord data type](https://github.com/pydata/xarray/blob/48a9dbe7d8dc2361bc985dd9fb1193a26135b310/xarray/core/indexing.py#L78). Therefore `loc` does not use a boolean mask but tries to match the indexes of the coord. **Minimal Complete Verifiable Example**: ```python 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 """", line 1, in 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](https://github.com/pydata/xarray/blob/48a9dbe7d8dc2361bc985dd9fb1193a26135b310/xarray/core/indexing.py#L78), 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
","{""url"": ""https://api.github.com/repos/pydata/xarray/issues/5727/reactions"", ""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,completed,13221727,issue