寻找一种简单的方法来访问和导出 xarray 对象中的多个数据变量的新数组

Looking for a Simple Way to Access and Export to a new array multiple data variables in an xarray object

我有一个包含从 HDF4 格式导入的 MODIS 数据的 xarray 对象。数据集的结构类似于下面的结构,其中我将光谱波段以数组格式存储在数据变量中——每个波段都是一个不同的变量。

# Create example DataSet with 5 variables (let's pretend each layer is a band)
ds = xr.Dataset(
    {var: (("band", "x", "y"), np.random.rand(1, 10, 10)) for var in "abcde"}
)

如果波段存储在数组中,则可以很容易地探索数据并使用 .plot 和内置的小平面网格工具绘制每个波段。但是在这种情况下,我必须单独绘制每一层或使用循环。有没有一种快速的方法可以自动抓取 x 个变量或波段(例如 b、c 和 e)并绘制它们?

在某些情况下,您可能需要绘制 RGB 图像 - 所以我会这样做:

# This is one way of combining  several bands into a single  array object however it's  very 
# manual. I need to specify each band in  the concat statement. But it does  achieve
# the output that I want using a manual approach.
new_object = xr.concat([ds.b,
             ds.c],
             ds.e,
             dim="band")

# Now I can plot the data
new_object.imshow.plot()

我的目标是自动选择 x 个波段(或 x 个数据变量)进行绘图/可视化和分析。我不想像上面那样将每个波段硬编码到 concat() 函数中。在上面的示例中,我想绘制一个 RGB 图像。在其他示例中,我想在加法处理之前直观地探索每个波段,或者只是提取几个波段用于其他类型的计算和分析。

谢谢指点!!

我想 xarray.Dataset.to_array() 可能就是您要找的。例如,对于 RGB 图像,我认为类似以下的内容会起作用:

ds.squeeze("band").to_array(dim="band").sel(band=["b", "c", "e"]).plot.imshow()

在这种情况下,您还可以对 "band" 维度进行分面:

ds.squeeze("band").to_array(dim="band").plot(col="band")