需要使用一组坐标快速对一个非常大的 ncdf 进行子集化

Need to quickly subset a very big ncdf using a set of coordinates

我有一个 netcdf 文件,其中包含一个浮点数组 (21600, 43200)。我不想将整个数组读入 RAM,因为它太大了,所以我使用了 NetCDF4 库中的 Dataset 对象读取数组。

我想使用两个 300-400 坐标的一维 numpy 数组(x_coords、y_coords)计算此数组子集的平均值。

我认为我不能使用基本索引,因为我的坐标不是连续的。我目前正在做的只是将数组直接馈送到对象中,如下所示:

ncdf_data = Dataset(file, 'r')
mean = np.mean(ncdf_data.variables['q'][x_coords, y_coords])

以上代码对我来说花费的时间太长了(大约 3-4 秒,具体取决于我使用的坐标),我想以某种方式加快速度。有没有一种 pythonic 方法可以用来直接从这样的子集中计算出平均值而不触发花哨的索引?

我知道 h5py 警告花式索引速度慢,

docs.h5py.org/en/latest/high/dataset.html#fancy-indexing. 

netcdf 可能有同样的问题。

您能否加载包含所有值的连续切片,并将更快的 numpy 高级索引应用于该子集?或者您可能必须使用块。

numpy 高级索引比它的基本切片慢,但仍然比直接从文件中进行花哨的索引快很多。

无论您如何操作,np.mean 都将对内存中的数据进行操作,而不是直接对文件中的数据进行操作。花式索引的缓慢是因为它必须访问分散在整个文件中的数据。将数据加载到内存中的数组中并不是最慢的部分。慢的部分是查找和读取文件。

将文件放在更快的驱动器上(例如固态驱动器)可能会有所帮助。