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/issues/1388#issuecomment-363072151,https://api.github.com/repos/pydata/xarray/issues/1388,363072151,MDEyOklzc3VlQ29tbWVudDM2MzA3MjE1MQ==,244887,2018-02-05T12:35:10Z,2018-02-05T12:35:10Z,CONTRIBUTOR,"@fujiisoup and @shoyer Really enlightening comments above. I think I am starting to get the dao of xarray a bit better :) >I was thinking whether such aggregation methods (including argmin) should propagate the coordinate. Agreed it would be nice to have a consistent and well reasoned rule for coordinate propagation in aggregation methods. I think a key point here, which gets brought up in your example is that it might make sense to have different subrules depending on the semantics of the operation. Functions like `argmax` are explicitly concerned with underlying ""indices"" (dimensions or otherwise) and so may call for different behavior from the `mean`, which explicitly is explicitly invariant under permutations of the underlying indices. The `max`/`min`/`median` functions are interesting case to think about, in that they are also invariant with under change of underlying indices, but can have potentially more than one index that they are associated with and do not ""destroy"" information about the value at those indices. >My concern with adding an additional dimension is that it is always a little surprising and error-prone when we invent new dimension names not supplied by the user (for example, this can lead to conflicting names) Yeah, I felt a little dirty appending '_argmax'. >I think my favorite option is (2) with da.argmin_indices() returning a Dataset, which will allow da[da.argmin_indices()] OK. I think I understand now why @fujiisoup proposed output a Dataset rather than an array. That's a natural syntax for getting the values from the indices. >Either way, I would like a separate dedicated method for returning multiple indexing arrays. +1 to dedicated adding more methods if needed, since I think even if it isn;t needed the associated docs will need to make sure users are aware of the analogous `idx*` methods if they get added. ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,224878728 https://github.com/pydata/xarray/issues/1388#issuecomment-362717912,https://api.github.com/repos/pydata/xarray/issues/1388,362717912,MDEyOklzc3VlQ29tbWVudDM2MjcxNzkxMg==,244887,2018-02-02T21:50:05Z,2018-02-02T21:50:05Z,CONTRIBUTOR,"I just came across the various argmax/idxmax (and related min) related issues recently in a project I have been working on. In addition to agreeing that docs should be updated when appropriate here are my two or three cents: - As someone new to xarray I like the idea of having both argmax/argmin and argmax_indices/argmin_indices, with the former returning the coordinate indices and the latter the underlying numpy indices analogous to numpy.argmax/numpy.argmin methods. This makes migrating from numpy ndarrays data and collection of associated index arrays obvious (a common path into the xarray world I think). - I can also get that idxmax/idxmin might make a better name given that one can have multi-indexed coordinates. If both argmax and idxmax methods are retained probably good to have docs cross reference. - In any case, to respond to @fujiisoup's above proposal, I like the idea of retaining the dimension names in the output, and adding a dimension to hold argmax dims, but think it might make more sense to output a DataArray. By way of example, if I had something like: ```python size = (2,2,2,2) dims = list(""wxyz"") data = np.random.rand(*size) coords = {dim:[""{0}_{1}"".format(dim,s) for s in range(s)] for dim,s in zip(dims,size)} da = xr.DataArray(data, dims=dims, coords=coords) >>>da array([[[[ 0.149945, 0.230338], [ 0.626969, 0.299918]], [[ 0.351764, 0.286436], [ 0.130604, 0.982152]]], [[[ 0.262667, 0.950426], [ 0.76655 , 0.681631]], [[ 0.635468, 0.735071], [ 0.901116, 0.601303]]]]) Coordinates: * w (w) >>argmax(da) array(['w_0', 'x_1', 'y_1', 'z_1'], dtype='>>argmax(da, dim=list(""wy"")) array([[['w_1', 'y_1'], ['w_1', 'y_0']], [['w_1', 'y_1'], ['w_0', 'y_1']]], dtype=object) Coordinates: * x (x) object 'x_0' 'x_1' * z (z) object 'z_0' 'z_1' * argmaxdim (argmaxdim)