Python Xarray,按索引或维度排序?

Python Xarray, sort by index or dimension?

xarray 中是否有某种 sort_indexsort_by_dimension 方法,很像 pandas.DataFrame.sort_index(),我可以在其中对 xarray.DataArray 对象进行排序它的维度之一?在用法方面,我在想 data_array.sort(dim="dimension_name").

您的意思是重新排列维度? 例如,使用 .transpose() 您可以重新排序整个数据集或特定数据数组的维度,例如

ds.transpose('lat','lon','time')

我找不到在 xarray 中内置执行此操作的好方法,因此我通过使用我想要排序的坐标中的排序值进行切片来创建一个新数组:da_sorted=da.loc[{'lon':sorted(da.coords['lon'].values)}]

这是一个更大的示例,其中包含测试数据,显示了它在实践中的样子:

import numpy as np
import xarray as xr

data = np.random.rand(2, 3)

lat = [47, 45]

lon = [-118, -122, -120]
da = xr.DataArray(data, coords=[lat, lon], dims=['lat', 'lon'])


>>>> da
<xarray.DataArray (lat: 2, lon: 3)>
array([[ 0.16118 ,  0.215621,  0.599749],
       [ 0.144778,  0.984167,  0.416469]])
Coordinates:
  * lat      (lat) int64 47 45
  * lon      (lon) int64 -118 -122 -120,


da_sorted = da.loc[{'lon':sorted(da.coords['lon'].values)}]
>>>> da_sorted
<xarray.DataArray (lat: 2, lon: 3)>
array([[ 0.215621,  0.599749,  0.16118 ],
       [ 0.984167,  0.416469,  0.144778]])
Coordinates:
  * lat      (lat) int64 47 45
  * lon      (lon) int64 -122 -120 -118

xarray 现在有一个用于此任务的 built-in 方法,可以使用 .sortby() https://xarray.pydata.org/en/stable/generated/xarray.DataArray.sortby.html

轻松执行

@Kyle Heuton 发布的代码现在变为:

import numpy as np
import xarray as xr

data = np.random.rand(2, 3)

lat = [47, 45]

lon = [-118, -122, -120]
da = xr.DataArray(data, coords=[lat, lon], dims=['lat', 'lon'])


>>>> da
<xarray.DataArray (lat: 2, lon: 3)>
array([[ 0.16118 ,  0.215621,  0.599749],
       [ 0.144778,  0.984167,  0.416469]])
Coordinates:
  * lat      (lat) int64 47 45
  * lon      (lon) int64 -118 -122 -120,


da_sorted = da.sortby(da.lon)
>>>> da_sorted
<xarray.DataArray (lat: 2, lon: 3)>
array([[ 0.215621,  0.599749,  0.16118 ],
       [ 0.984167,  0.416469,  0.144778]])
Coordinates:
  * lat      (lat) int64 47 45
  * lon      (lon) int64 -122 -120 -118