SatPy 一次加载所有频道

SatPy load all channels at once

我有一个场景对象,我想将所有通道加载到一个形状为 (24,24,3) 的 numpy 数组中。其中 3 是通道数。

scene_xybox = scn.crop(xy_bbox=box)

我必须select每个频道:

channel= scene_xybox['VIS006'].values

重复,最后堆叠。 有没有办法用一行获取堆叠的numpy数组。

每个盒子需要5秒,我有很多文件,对一张图片中的多个盒子做同样的操作需要很长时间。

一个完美的答案可能需要你提供更多信息,比如你的最终目标是什么,你要剪掉多少个“盒子”等等。但我会先看看我能弄清楚什么。我假设您根本没有在代码中使用 Scene.resample 对数据进行重采样。

Satpy 使用 dask,因此如果可能的话最好一次计算所有内容。或者至少限制计算事物的次数(.values 计算 dask 数组)。如果你有很多框要切掉并且你的系统有可用内存,你可能想自己计算所有 xy bbox 的切片(我认为有一些方法可以帮助解决这个问题),加载整个图像(见 xr.concat 下面),然后使用基本的切片技术来获得每个盒子切口。这应该避免您每次调用 .values 时都从磁盘加载数据,但也确实有助于处理您拥有的其他文件,因为切片应该始终相同(特殊仪器情况除外)。

你说你希望最终的形状是 (rows, cols, N)。你有什么理由不能 (N, rows, cols) 吗?后者应该更快,因为数组处于其原始的连续形式。如果你在这之后做的任何处理都可以用 dask 完成,那么这将与将要完成的任务一起“流动”得很好。

您可以使用 xr.concat,一次传递所有 DataArray,然后调用 .values 获取下面的完整 numpy 数组。这应该同时计算所有波段。类似于:

final_arr = xr.concat([scn['VIS006'], scn['band2'], scn['band3']], "bands").values