【发布时间】:2022-04-04 20:12:06
【问题描述】:
xarray 中是否有某种sort_index 或sort_by_dimension 方法,很像pandas.DataFrame.sort_index(),我可以在其中按xarray.DataArray 对象的一个维度对其进行排序?在使用方面,我在想data_array.sort(dim="dimension_name")之类的东西。
【问题讨论】:
标签: python python-xarray
xarray 中是否有某种sort_index 或sort_by_dimension 方法,很像pandas.DataFrame.sort_index(),我可以在其中按xarray.DataArray 对象的一个维度对其进行排序?在使用方面,我在想data_array.sort(dim="dimension_name")之类的东西。
【问题讨论】:
标签: python python-xarray
我在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
【讨论】:
你的意思是重新排列尺寸吗?
例如,使用.transpose(),您可以重新排序整个数据集或特定数据数组的维度,例如
ds.transpose('lat','lon','time')
【讨论】:
DataArray,例如按“lon”排序。
xarray 现在有一个用于此任务的内置方法,可以使用.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
【讨论】: