月关宝盒
假设您有以下 DataArray:>>> da<xarray.DataArray (time: 5, lon: 4, lat: 3)>array([[[...]]])Coordinates: * time (time) int64 0 1 2 3 4 * lon (lon) int64 0 1 2 3 * lat (lat) int64 0 1 2并且您想选择以下 (lon, lat) 点:>>> points = [(0, 0), (0, 1), (2, 1)] # list(tuple(lon, lat), ...)然后,您不会坚持使用原始的 (lon, lat) 网格,因此您可以将这些维度堆叠在一起:>>> da.stack(pos=("lon", "lat"))<xarray.DataArray (time: 5, pos: 12)>array([[...]])Coordinates: * time (time) int64 0 1 2 3 4 * pos (pos) MultiIndex - lon (pos) int64 0 0 0 1 1 1 2 2 2 3 3 3 - lat (pos) int64 0 1 2 0 1 2 0 1 2 0 1 2从那里,您可以选择点:>>> da.stack(pos=("lon", "lat")).sel(pos=points)<xarray.DataArray (time: 5, pos: 3)>array([[...]])Coordinates: * time (time) int64 0 1 2 3 4 * pos (pos) MultiIndex - lon (pos) int64 0 0 2 - lat (pos) int64 0 1 1计算它们的平均时间:>>> da.stack(pos=("lon", "lat")).sel(pos=points).mean("time")<xarray.DataArray (pos: 3)>array([24., 25., 31.])Coordinates: * pos (pos) MultiIndex - lon (pos) int64 0 0 2 - lat (pos) int64 0 1 1并且,如果需要,通过取消堆叠返回到原始网格:>>> da.stack(pos=("lon", "lat")).sel(pos=points).mean("time").unstack("pos")<xarray.DataArray (lon: 2, lat: 2)>array([[24., 25.], [nan, 31.]])Coordinates: * lon (lon) int64 0 2 * lat (lat) int64 0 1请注意,会有一些nan值未选择新网格的点(这就是我们首先堆叠的原因)。