在Python中高效读取netCDF变量

4

我需要能够快速在Python中读取大量的netCDF变量(每个文件1个变量)。我发现netCDF4库中的Dataset函数与其他语言(例如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
NumPy的强大之处在于,通过它所保留的有关数据的元数据,您可以创建对现有内存数据的视图。因此,通过指针,复制始终比视图慢。像@JCOidl说的那样,不清楚为什么您不只是使用“raw_data = openFile.variables['MergedReflectivityQCComposite'][:]”。 - Eric Bridger
这个简单的步骤可以将读取速度提高一个数量级。谢谢!我会尝试更多地利用Numpy指针。你知道有没有好的参考资料可以更详细地解释这个概念(我是新手)? - weather guy
文档:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html#copies-and-views 和 SO 上的链接 https://dev59.com/tW855IYBdhLWcg3wYjSF - Eric Bridger
我不确定在你的情况下是否更快,但我强烈建议使用 xarray - 它可以在更高的级别处理网格数据,使编码更加美观。如果你正在处理大型数组,则可能也更快。请参见 https://dev59.com/3lYN5IYBdhLWcg3wm5Ki 以了解性能讨论。 - naught101
3个回答

3
Numpy的强大之处在于通过其对数据保留的元数据,您可以创建对内存中现有数据的视图。因此,通过指针,复制始终比查看慢。正如JCOidl所说,不清楚为什么您不只是使用:
 raw_data = openFile.variables['MergedReflectivityQCComposite'][:] 

更多信息请参见SciPy Cookbook和SO 查看NumPy数组的视图?


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秒。你的结果可能会有所不同,但还是值得一试的。


你知道Windows上有类似的库吗?PyNIO在那里不可用。 - bart cubrich

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,但我发现它比打开函数使用更多的空间。对于xr.open_mfdataset,如果需要,您也可以沿着文件的维度进行分块。这两个函数都有其他选项,您可能会对在xarray文档中了解更多信息感兴趣。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接