在python中高效读取netcdf变量

时间:2015-12-08 15:29:51

标签: python performance netcdf

我需要能够在python中快速读取大量的netCDF变量(每个文件1个变量)。我发现netCDF4库中的数据集功能与其他语言(例如IDL)中的读取实用程序相比相当慢。

我的变量的形状为(2600,5200)并且类型为float。它们对我来说似乎不大(文件大小= 52Mb)。

这是我的代码:

import numpy as np
from netCDF4 import Dataset
import time
file = '20151120-235839.netcdf'
t0=time.time()
openFile = Dataset(file,'r')
raw_data = openFile.variables['MergedReflectivityQCComposite']
data = np.copy(raw_data)
openFile.close()
print time.time-t0

读取一个变量(一个文件)大约需要3秒钟。我认为主要的减速是np.copy。 raw_data<type 'netCDF4.Variable'>,因此是副本。这是在python中进行netCDF读取的最佳/最快方式吗?

感谢。

3 个答案:

答案 0 :(得分:3)

Numpy的强大之处在于,您可以通过其保留的有关数据的元数据为内存中的现有数据创建视图。因此,通过指针,副本总是比视图慢。正如JCOidl所说,不清楚为什么你不能使用:

 raw_data = openFile.variables['MergedReflectivityQCComposite'][:] 

有关详细信息,请参阅SciPy Cookbook和SO View onto a numpy array?

答案 1 :(得分:2)

我不确定该怎么说np.copy操作(这确实很慢),但我发现UCAR的PyNIO模块适用于NetCDF和HDF文件。这会将data放入一个numpy数组中:

import Nio

f = Nio.open_file(file, format="netcdf")
data = f.variables['MergedReflectivityQCComposite'][:]
f.close()

在ndfCDF文件上测试你的代码与PyNIO代码我已经为PyNIO产生了1.1秒,而netCDF4模块则为3.1秒。你的结果可能有所不同值得一看。

答案 2 :(得分:1)

您可以为此使用xarray。

%matplotlib inline 
import xarray as xr

### Single netcdf file ###
ds =  xr.open_dataset('path/file.nc')

### Opening multiple NetCDF files and concatenating them by time ####
ds = xr.open_mfdatset('path/*.nc', concat_dim='time

要读取变量,您只需键入ds.MergedReflectivityQCCompositeds.['MergedReflectivityQCComposite'][:]

您还可以使用xr.load_dataset,但我发现它比open函数占用更多的空间。对于xr.open_mfdataset,如果需要,还可以沿文件的尺寸进行分块。这两个功能还有其他选择,您可能有兴趣在xarray文档中对其进行详细了解。