html_url,issue_url,id,node_id,user,created_at,updated_at,author_association,body,reactions,performed_via_github_app,issue https://github.com/pydata/xarray/pull/3922#issuecomment-608440269,https://api.github.com/repos/pydata/xarray/issues/3922,608440269,MDEyOklzc3VlQ29tbWVudDYwODQ0MDI2OQ==,14808389,2020-04-03T13:41:50Z,2020-04-03T13:41:50Z,MEMBER,"I'd say add a new entry. Also, I think we're all just reviewers so adding just your name should be fine.","{""total_count"": 2, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 1, ""rocket"": 0, ""eyes"": 0}",,591101988 https://github.com/pydata/xarray/pull/3922#issuecomment-608406175,https://api.github.com/repos/pydata/xarray/issues/3922,608406175,MDEyOklzc3VlQ29tbWVudDYwODQwNjE3NQ==,14808389,2020-04-03T12:28:51Z,2020-04-03T12:28:51Z,MEMBER,"I think so? For now, xfail if `use_dask and x.dtype.kind == ""M""`","{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,591101988 https://github.com/pydata/xarray/pull/3922#issuecomment-608391739,https://api.github.com/repos/pydata/xarray/issues/3922,608391739,MDEyOklzc3VlQ29tbWVudDYwODM5MTczOQ==,14808389,2020-04-03T11:53:22Z,2020-04-03T12:02:30Z,MEMBER,"it seems you can't use `argmin` with `dask` arrays if the dtype is `datetime64` (`M8`): ```python In [24]: time = np.asarray(pd.date_range(""2019-07-17"", periods=10)) ...: array = xr.DataArray( ...: time, ...: dims=""x"", ...: coords={""x"": np.arange(time.size) * 4}, ...: ).chunk({}) ...: array Out[24]: dask.array, shape=(10,), dtype=datetime64[ns], chunksize=(10,), chunktype=numpy.ndarray> Coordinates: * x (x) int64 0 4 8 12 16 20 24 28 32 36 In [25]: array.compute().argmin(dim=""x"") Out[25]: array(0) In [26]: array.argmin(dim=""x"") --------------------------------------------------------------------------- UFuncTypeError Traceback (most recent call last) in ----> 1 array.argmin(dim=""x"") .../xarray/core/common.py in wrapped_func(self, dim, axis, skipna, **kwargs) 44 45 def wrapped_func(self, dim=None, axis=None, skipna=None, **kwargs): ---> 46 return self.reduce(func, dim, axis, skipna=skipna, **kwargs) 47 48 else: .../xarray/core/dataarray.py in reduce(self, func, dim, axis, keep_attrs, keepdims, **kwargs) 2260 """""" 2261 -> 2262 var = self.variable.reduce(func, dim, axis, keep_attrs, keepdims, **kwargs) 2263 return self._replace_maybe_drop_dims(var) 2264 .../xarray/core/variable.py in reduce(self, func, dim, axis, keep_attrs, keepdims, allow_lazy, **kwargs) 1573 1574 if axis is not None: -> 1575 data = func(input_data, axis=axis, **kwargs) 1576 else: 1577 data = func(input_data, **kwargs) .../xarray/core/duck_array_ops.py in f(values, axis, skipna, **kwargs) 302 303 try: --> 304 return func(values, axis=axis, **kwargs) 305 except AttributeError: 306 if not isinstance(values, dask_array_type): .../xarray/core/duck_array_ops.py in f(*args, **kwargs) 45 else: 46 wrapped = getattr(eager_module, name) ---> 47 return wrapped(*args, **kwargs) 48 49 else: ~/.conda/envs/xarray/lib/python3.8/site-packages/dask/array/reductions.py in wrapped(x, axis, split_every, out) 1002 1003 def wrapped(x, axis=None, split_every=None, out=None): -> 1004 return arg_reduction( 1005 x, chunk, combine, agg, axis, split_every=split_every, out=out 1006 ) ~/.conda/envs/xarray/lib/python3.8/site-packages/dask/array/reductions.py in arg_reduction(x, chunk, combine, agg, axis, split_every, out) 980 tmp = Array(graph, name, chunks, dtype=x.dtype) 981 dtype = np.argmin([1]).dtype --> 982 result = _tree_reduce(tmp, agg, axis, False, dtype, split_every, combine) 983 return handle_out(out, result) 984 ~/.conda/envs/xarray/lib/python3.8/site-packages/dask/array/reductions.py in _tree_reduce(x, aggregate, axis, keepdims, dtype, split_every, combine, name, concatenate, reduced_meta) 243 if concatenate: 244 func = compose(func, partial(_concatenate2, axes=axis)) --> 245 return partial_reduce( 246 func, 247 x, ~/.conda/envs/xarray/lib/python3.8/site-packages/dask/array/reductions.py in partial_reduce(func, x, split_every, keepdims, dtype, name, reduced_meta) 314 if is_arraylike(meta) and meta.ndim != len(out_chunks): 315 if len(out_chunks) == 0: --> 316 meta = meta.sum() 317 else: 318 meta = meta.reshape((0,) * len(out_chunks)) ~/.conda/envs/xarray/lib/python3.8/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims, initial, where) 36 def _sum(a, axis=None, dtype=None, out=None, keepdims=False, 37 initial=_NoValue, where=True): ---> 38 return umr_sum(a, axis, dtype, out, keepdims, initial, where) 39 40 def _prod(a, axis=None, dtype=None, out=None, keepdims=False, UFuncTypeError: ufunc 'add' cannot use operands with types dtype('MWE with only numpy / dask.array ```python In [32]: time = np.asarray(pd.date_range(""2019-07-17"", periods=10)) ...: np.argmin(da.from_array(time)) --------------------------------------------------------------------------- UFuncTypeError Traceback (most recent call last) in 1 time = np.asarray(pd.date_range(""2019-07-17"", periods=10)) ----> 2 np.argmin(da.from_array(time)) <__array_function__ internals> in argmin(*args, **kwargs) ~/.conda/envs/xarray/lib/python3.8/site-packages/dask/array/core.py in __array_function__(self, func, types, args, kwargs) 1348 if da_func is func: 1349 return handle_nonmatching_names(func, args, kwargs) -> 1350 return da_func(*args, **kwargs) 1351 1352 @property ~/.conda/envs/xarray/lib/python3.8/site-packages/dask/array/reductions.py in wrapped(x, axis, split_every, out) 1002 1003 def wrapped(x, axis=None, split_every=None, out=None): -> 1004 return arg_reduction( 1005 x, chunk, combine, agg, axis, split_every=split_every, out=out 1006 ) ~/.conda/envs/xarray/lib/python3.8/site-packages/dask/array/reductions.py in arg_reduction(x, chunk, combine, agg, axis, split_every, out) 980 tmp = Array(graph, name, chunks, dtype=x.dtype) 981 dtype = np.argmin([1]).dtype --> 982 result = _tree_reduce(tmp, agg, axis, False, dtype, split_every, combine) 983 return handle_out(out, result) 984 ~/.conda/envs/xarray/lib/python3.8/site-packages/dask/array/reductions.py in _tree_reduce(x, aggregate, axis, keepdims, dtype, split_every, combine, name, concatenate, reduced_meta) 243 if concatenate: 244 func = compose(func, partial(_concatenate2, axes=axis)) --> 245 return partial_reduce( 246 func, 247 x, ~/.conda/envs/xarray/lib/python3.8/site-packages/dask/array/reductions.py in partial_reduce(func, x, split_every, keepdims, dtype, name, reduced_meta) 314 if is_arraylike(meta) and meta.ndim != len(out_chunks): 315 if len(out_chunks) == 0: --> 316 meta = meta.sum() 317 else: 318 meta = meta.reshape((0,) * len(out_chunks)) ~/.conda/envs/xarray/lib/python3.8/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims, initial, where) 36 def _sum(a, axis=None, dtype=None, out=None, keepdims=False, 37 initial=_NoValue, where=True): ---> 38 return umr_sum(a, axis, dtype, out, keepdims, initial, where) 39 40 def _prod(a, axis=None, dtype=None, out=None, keepdims=False, UFuncTypeError: ufunc 'add' cannot use operands with types dtype('","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,591101988 https://github.com/pydata/xarray/pull/3922#issuecomment-608341636,https://api.github.com/repos/pydata/xarray/issues/3922,608341636,MDEyOklzc3VlQ29tbWVudDYwODM0MTYzNg==,14808389,2020-04-03T09:47:14Z,2020-04-03T09:55:35Z,MEMBER,"I'd put the `dask` tests directly below the `idxmin` / `idxmax` tests, decorated with `requires_dask`. Edit: that's easy for `test_dataarray.py`, but not as much for `test_dataset.py`. Since `Dataset` delegates to the `DataArray` methods we might get away with not adding `dask` tests to `Dataset`, but I'm not really sure.","{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,591101988 https://github.com/pydata/xarray/pull/3922#issuecomment-608331001,https://api.github.com/repos/pydata/xarray/issues/3922,608331001,MDEyOklzc3VlQ29tbWVudDYwODMzMTAwMQ==,14808389,2020-04-03T09:24:39Z,2020-04-03T09:24:39Z,MEMBER,:+1:,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,591101988 https://github.com/pydata/xarray/pull/3922#issuecomment-608322689,https://api.github.com/repos/pydata/xarray/issues/3922,608322689,MDEyOklzc3VlQ29tbWVudDYwODMyMjY4OQ==,14808389,2020-04-03T09:06:42Z,2020-04-03T09:06:42Z,MEMBER,"The issue is that `argmax` produces a `ndim - 1` array of indexes. In the case of 2D input data that would be 1D, so since indexing only allows to index with 1D arrays, your code works. For `ndim > 2`, we'd be trying to index with arrays with `ndim > 1`, so the indexing fails. To get your 3D example (and potentially every N-D example) to work, simply fall back to the wrapped array's integer indexing (using `coordarray.data`): ```python In [2]: darray = da.from_array( ...: np.random.RandomState(0).randn(10 *20 * 30).reshape(10, 20, 30), ...: chunks=(1, 20, 30), # so we actually have multiple blocks ...: name='data_arr' ...: ) ...: array = xr.DataArray( ...: darray, ...: dims=[""x"", ""y"", 'z'], ...: coords={""x"": np.arange(10), ""y"": np.arange(20), ""z"": np.arange(30)}, ...: ) ...: array Out[2]: dask.array Coordinates: * x (x) int64 0 1 2 3 4 5 6 7 8 9 * y (y) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 * z (z) int64 0 1 2 3 4 5 6 7 8 9 10 ... 20 21 22 23 24 25 26 27 28 29 In [3]: indx = array.argmin(dim='z', keep_attrs=True, skipna=False) ...: res = indx.copy( ...: data=indx.data.map_blocks( ...: lambda ind, coord: coord[(ind,)], ...: array.z.data, ...: dtype=array.z.dtype ...: ) ...: ) In [4]: res.compute() Out[4]: array([[20, 3, 3, 11, 20, 17, 3, 27, 24, 1, 7, 4, 22, 14, 7, 18, 5, 18, 7, 19], [10, 21, 25, 3, 15, 25, 28, 8, 10, 9, 13, 3, 24, 17, 19, 23, 12, 19, 19, 28], [ 1, 26, 10, 9, 16, 8, 17, 8, 6, 24, 28, 13, 23, 22, 26, 13, 28, 11, 6, 16], [ 6, 9, 26, 27, 1, 2, 21, 8, 10, 19, 14, 14, 20, 25, 24, 4, 18, 12, 20, 2], [22, 5, 12, 17, 13, 23, 23, 8, 27, 22, 1, 19, 26, 16, 12, 17, 19, 28, 8, 12], [20, 8, 25, 13, 4, 12, 23, 13, 27, 18, 15, 28, 10, 10, 0, 12, 5, 14, 5, 27], [29, 0, 19, 7, 15, 2, 8, 8, 13, 4, 12, 1, 7, 19, 14, 0, 3, 7, 12, 9], [ 9, 8, 4, 9, 17, 6, 7, 5, 29, 0, 15, 28, 22, 6, 24, 24, 20, 0, 24, 23], [ 1, 19, 12, 20, 4, 26, 5, 13, 21, 26, 25, 10, 5, 1, 11, 21, 6, 18, 4, 21], [15, 27, 13, 7, 25, 3, 14, 14, 17, 15, 11, 4, 16, 22, 22, 23, 0, 16, 26, 13]]) Coordinates: * x (x) int64 0 1 2 3 4 5 6 7 8 9 * y (y) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ``` Note that in this case `res == indx` since `z = np.arange(30)`","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,591101988