【问题标题】:Need to quickly subset a very big ncdf using a set of coordinates需要使用一组坐标快速子集一个非常大的 ncdf
【发布时间】:2017-07-14 08:25:08
【问题描述】:

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

我想使用 300-400 坐标的两个 1D numpy 数组 (x_coords, y_coords) 计算该数组的子集的平均值。

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

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

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

【问题讨论】:

    标签: python-2.7 numpy indexing slice netcdf4


    【解决方案1】:

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

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

    netcdf 可能有同样的问题。

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

    numpy 高级索引比它的基本切片要慢,但这仍然比直接从文件中创建索引要快很多。

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

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

    【讨论】:

    • 我会尝试将较小的块读入内存,然后将我的列表应用到该块上。感谢您的建议!
    猜你喜欢
    • 2019-03-11
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多