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/3957#issuecomment-707744782,https://api.github.com/repos/pydata/xarray/issues/3957,707744782,MDEyOklzc3VlQ29tbWVudDcwNzc0NDc4Mg==,30388627,2020-10-13T13:38:34Z,2020-10-13T13:38:34Z,NONE,"@JavierRuano I find the simpler solution from a similar question in [stack overflow](https://stackoverflow.com/a/53386129).
```
sort_pair = np.take_along_axis(pair.values, cld.argsort(axis=0), axis=0)
```
## Complete example
```
import xarray as xr
import numpy as np
x = 4
y = 2
z = 4
data = np.arange(x*y*z).reshape(z, y, x)
# 3d array with coords
cld_1 = xr.DataArray(data, dims=['z', 'y', 'x'], coords={'z': np.arange(z)})
# 2d array without coords
cld_2 = xr.DataArray(np.arange(x*y).reshape(y, x)*1.5+1, dims=['y', 'x'])
# expand 2d to 3d
cld_2 = cld_2.expand_dims(z=[4])
# concat
cld = xr.concat([cld_1, cld_2], dim='z')
# paired array
pair = cld.copy(data=np.arange(x*y*(z+1)).reshape(z+1, y, x))
sort_pair = np.take_along_axis(pair.values, cld.argsort(axis=0), axis=0)
print(cld)
print(pair)
print(sort_pair)
```
**Output**:
```
array([[[ 0. , 1. , 2. , 3. ],
[ 4. , 5. , 6. , 7. ]],
[[ 8. , 9. , 10. , 11. ],
[12. , 13. , 14. , 15. ]],
[[16. , 17. , 18. , 19. ],
[20. , 21. , 22. , 23. ]],
[[24. , 25. , 26. , 27. ],
[28. , 29. , 30. , 31. ]],
[[ 1. , 2.5, 4. , 5.5],
[ 7. , 8.5, 10. , 11.5]]])
Coordinates:
* z (z) int64 0 1 2 3 4
Dimensions without coordinates: y, x
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]],
[[16, 17, 18, 19],
[20, 21, 22, 23]],
[[24, 25, 26, 27],
[28, 29, 30, 31]],
[[32, 33, 34, 35],
[36, 37, 38, 39]]])
Coordinates:
* z (z) int64 0 1 2 3 4
Dimensions without coordinates: y, x
[[[ 0 1 2 3]
[ 4 5 6 7]]
[[32 33 34 35]
[36 37 38 39]]
[[ 8 9 10 11]
[12 13 14 15]]
[[16 17 18 19]
[20 21 22 23]]
[[24 25 26 27]
```
Note, I have to use `pair.values` instead of `pair` in the last sorting step.
Otherwise, I will get this error:
```
IndexError: Unlabeled multi-dimensional array cannot be used for indexing: y
```","{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,596606599
https://github.com/pydata/xarray/issues/3957#issuecomment-611483929,https://api.github.com/repos/pydata/xarray/issues/3957,611483929,MDEyOklzc3VlQ29tbWVudDYxMTQ4MzkyOQ==,30388627,2020-04-09T11:43:51Z,2020-04-09T11:43:51Z,NONE,I need to use `df.index = pd.MultiIndex.from_arrays(.....)`. See https://github.com/pandas-dev/pandas/issues/33420,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,596606599
https://github.com/pydata/xarray/issues/3957#issuecomment-611348892,https://api.github.com/repos/pydata/xarray/issues/3957,611348892,MDEyOklzc3VlQ29tbWVudDYxMTM0ODg5Mg==,30388627,2020-04-09T06:13:07Z,2020-04-09T06:13:07Z,NONE,"@JavierRuano When the `dataframe` is converted back to `dataset`, the values aren't changed because of the unchanged `Multiindex` in `dataframe` ... I have tried this:
```
df = ds.to_dataframe()
new_df = df.sort_values(by=['x', 'y', 'cld'])
new_df.index.set_levels(list(np.arange(ds['cld'].sizes['z'])),
level='z', inplace=True)
```
But, it doesn't work. Still trying ...","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,596606599
https://github.com/pydata/xarray/issues/3957#issuecomment-611299453,https://api.github.com/repos/pydata/xarray/issues/3957,611299453,MDEyOklzc3VlQ29tbWVudDYxMTI5OTQ1Mw==,30388627,2020-04-09T02:54:30Z,2020-04-09T02:54:30Z,NONE,"@JavierRuano Nice suggestion! I combine them to `dataset`, convert it to `dataframe` and then `sort_values`. Finally, convert the `dataframe` back to `dataset`:
```
ds = cld.to_dataset(name='cld')
ds['pair'] = pair
df = ds.to_dataframe()
new_ds = df.sort_values(by='cld').to_xarray().transpose()
```","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,596606599
https://github.com/pydata/xarray/issues/3957#issuecomment-611291129,https://api.github.com/repos/pydata/xarray/issues/3957,611291129,MDEyOklzc3VlQ29tbWVudDYxMTI5MTEyOQ==,30388627,2020-04-09T02:22:33Z,2020-04-09T02:22:33Z,NONE,"@JavierRuano Thank you very much. This example is a special case. If the order of `z` is different for each `x` and `y`, do we need to create a tmp DataArray to save the result of looping `x` and `y`?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,596606599