Python 3.x 带坐标因变量的xarray数据集切片

Python 3.x 带坐标因变量的xarray数据集切片,python-3.x,dataset,slice,python-xarray,Python 3.x,Dataset,Slice,Python Xarray,我在python3中构建了一个xarray数据集,其中包含坐标(时间、级别),用于在一天的观测中识别所有云底和云顶。变量levels是在给定时间可以识别的云底/云顶的维度。它每次存储云底/顶高度值 现在,我想选择位于给定高度范围内的所有云底和云顶,这些高度随时间变化。高度范围由阵列bottom\u mod和top\u mod确定。这些数组具有时间维度,并包含要选择的高度范围的边 xarray数据集是cloudStandard\u mod\u重塑的: Dimensions: (levels

我在python3中构建了一个xarray数据集,其中包含坐标
(时间、级别)
,用于在一天的观测中识别所有云底和云顶。变量
levels
是在给定时间可以识别的云底/云顶的维度。它每次存储云底/顶高度值

现在,我想选择位于给定高度范围内的所有云底和云顶,这些高度随时间变化。高度范围由阵列
bottom\u mod
top\u mod
确定。这些数组具有
时间
维度,并包含要选择的高度范围的边

xarray数据集是
cloudStandard\u mod\u重塑的

Dimensions:     (levels: 8, time: 9600)
Coordinates:
  * levels      (levels) int64 0 1 2 3 4 5 6 7
  * time        (time) datetime64[ns] 2013-04-14 ... 2013-04-14T23:59:51
Data variables:
    cloudTop    (time, levels) float64 nan nan nan nan nan ... nan nan nan nan
    cloudThick  (time, levels) float64 nan nan nan nan nan ... nan nan nan nan
    cloudBase   (time, levels) float64 nan nan nan nan nan ... nan nan nan nan
我尝试选择顶部和底部数组标识的范围内的高度,如下所示:

PBLclouds = cloudStandard_mod_reshaped.sel(levels=slice(bottom_mod[:], top_mod[:]))
但此指令只接受slice命令的标量值

您知道如何使用坐标相关的值进行切片吗?

您可以使用该方法

提供解决方案的行位于2下。

1。首先,创建一些类似您的数据:

数据集:

nlevels, ntime = 8, 50

ds = xr.Dataset(
    coords=dict(levels=np.arange(nlevels), time=np.arange(ntime),),
    data_vars=dict(
        cloudTop=(("levels", "time"), np.random.randn(nlevels, ntime)),
        cloudThick=(("levels", "time"), np.random.randn(nlevels, ntime)),
        cloudBase=(("levels", "time"), np.random.randn(nlevels, ntime)),
    ),
)
打印输出(ds)

打印输出(bot\u mod)

打印输出(ds_云)

我还不允许嵌入图像,所以这是一个链接:

<xarray.Dataset>
Dimensions:     (levels: 8, time: 50)
Coordinates:
  * levels      (levels) int64 0 1 2 3 4 5 6 7
  * time        (time) int64 0 1 2 3 4 5 6 7 8 9 ... 41 42 43 44 45 46 47 48 49
Data variables:
    cloudTop    (levels, time) float64 0.08375 0.04721 0.9379 ... 0.04877 2.339
    cloudThick  (levels, time) float64 -0.6441 -0.8338 -1.586 ... -1.026 -0.5652
    cloudBase   (levels, time) float64 -0.05004 -0.1729 0.7154 ... 0.06507 1.601
offset = 3

bot_mod = xr.DataArray(
    dims=("time"),
    coords=dict(time=np.arange(ntime)),
    data=np.random.randint(0, nlevels - offset, ntime),
    name="bot_mod",
)

top_mod = (bot_mod + offset).rename("top_mod")
<xarray.DataArray 'bot_mod' (time: 50)>
array([0, 1, 2, 2, 3, 1, 2, 1, 0, 2, 1, 3, 2, 0, 2, 4, 3, 3, 2, 1, 2, 0,
       2, 2, 0, 1, 1, 4, 1, 3, 0, 4, 0, 4, 4, 0, 4, 4, 1, 0, 3, 4, 4, 3,
       3, 0, 1, 2, 4, 0])
ds_clouds = ds.where((ds.levels > bot_mod) & (ds.levels < top_mod))
<xarray.Dataset>
Dimensions:     (levels: 8, time: 50)
Coordinates:
  * levels      (levels) int64 0 1 2 3 4 5 6 7
  * time        (time) int64 0 1 2 3 4 5 6 7 8 9 ... 41 42 43 44 45 46 47 48 49
Data variables:
    cloudTop    (levels, time) float64 nan nan nan nan nan ... nan nan nan nan
    cloudThick  (levels, time) float64 nan nan nan nan nan ... nan nan nan nan
    cloudBase   (levels, time) float64 nan nan nan nan nan ... nan nan nan nan
fig, axes = plt.subplots(ncols=2)

ds.cloudBase.plot.imshow(ax=axes[0])
ds_clouds.cloudBase.plot.imshow(ax=axes[1])

plt.show()