# Buggy code
def __getitem__(self, key):
    def to_int_tuple(key):
        # workaround for uint64 indexer (GH:1406)
        # TODO remove here after next dask release (0.15.3)
        return tuple([k.astype(int) if isinstance(k, np.ndarray) else k for k in key])

    if isinstance(key, BasicIndexer):
        return self.array[to_int_tuple(key)]
    elif isinstance(key, VectorizedIndexer):
        return self.array.vindex[to_int_tuple(tuple(key))]
    elif key is Ellipsis:
        return self.array
    else:
        assert isinstance(key, OuterIndexer)
        key = to_int_tuple(tuple(key))
        try:
            return self.array[key]
        except NotImplementedError:
            # manual orthogonal indexing.
            # TODO: port this upstream into dask in a saner way.
            value = self.array
            for axis, subkey in reversed(list(enumerate(key))):
                value = value[(slice(None),) * axis + (subkey,)]
            return value


# Traceback (ValueError)
import numpy as np
import xarray as xr

a = np.random.randn(4, 3)
a[1, 1] = np.NaN
da = xr.DataArray(a, dims=('y', 'x'), coords={'y':np.arange(4), 'x':np.arange(3)})
da.to_netcdf('test.nc')

with xr.open_dataarray('test.nc') as da:
da.dropna(dim='x', how='any')

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-37-8d137cf3a813> in <module>()
8
9 with xr.open_dataarray('test.nc') as da:
---> 10     da.dropna(dim='x', how='any')

~/.pyvirtualenvs/py3/lib/python3.5/site-packages/xarray/core/dataarray.py in dropna(self, dim, how, thresh)
1158         DataArray
1159         """
-> 1160         ds = self._to_temp_dataset().dropna(dim, how=how, thresh=thresh)
1161         return self._from_temp_dataset(ds)
1162

~/.pyvirtualenvs/py3/lib/python3.5/site-packages/xarray/core/dataset.py in dropna(self, dim, how, thresh, subset)
2292             raise TypeError('must specify how or thresh')
2293
-> 2294         return self.isel(**{dim: mask})
2295
2296     def fillna(self, value):

~/.pyvirtualenvs/py3/lib/python3.5/site-packages/xarray/core/dataset.py in isel(self, drop, **indexers)
1291         coord_names = set(variables).intersection(self._coord_names)
1292         selected = self._replace_vars_and_dims(variables,
-> 1293                                                coord_names=coord_names)
1294
1295         # Extract coordinates from indexers

~/.pyvirtualenvs/py3/lib/python3.5/site-packages/xarray/core/dataset.py in _replace_vars_and_dims(self, variables, coord_names, dims, attrs, inplace)
598         """
599         if dims is None:
--> 600             dims = calculate_dimensions(variables)
601         if inplace:
602             self._dims = dims

~/.pyvirtualenvs/py3/lib/python3.5/site-packages/xarray/core/dataset.py in calculate_dimensions(variables)
111                 raise ValueError('conflicting sizes for dimension %r: '
112                                  'length %s on %r and length %s on %r' %
--> 113                                  (dim, size, k, dims[dim], last_used[dim]))
114     return dims
115

ValueError: conflicting sizes for dimension 'y': length 2 on <this-array> and length 4 on 'y'

# Fixed code
def __getitem__(self, key):
    def to_int_tuple(key):
        # workaround for uint64 indexer (GH:1406)
        # TODO remove here after next dask release (0.15.3)
        return tuple(
            [
                k.astype(int)
                if isinstance(k, np.ndarray)
                else int(k)
                if isinstance(k, np.integer)
                else k
                for k in key
            ]
        )

    if isinstance(key, BasicIndexer):
        return self.array[to_int_tuple(key)]
    elif isinstance(key, VectorizedIndexer):
        return self.array.vindex[to_int_tuple(tuple(key))]
    elif key is Ellipsis:
        return self.array
    else:
        assert isinstance(key, OuterIndexer)
        key = to_int_tuple(tuple(key))
        try:
            return self.array[key]
        except NotImplementedError:
            # manual orthogonal indexing.
            # TODO: port this upstream into dask in a saner way.
            value = self.array
            for axis, subkey in reversed(list(enumerate(key))):
                value = value[(slice(None),) * axis + (subkey,)]
            return value