【发布时间】:2014-03-11 12:14:20
【问题描述】:
与scipy.io.netcdf相比,当切换到netCDF4 Python模块时,我从NetCDF文件中提取变量数据值的min/max的常用方法是慢一个数量级。
我正在处理相对较大的海洋模型输出文件(来自 ROMS),在给定的地图区域(夏威夷)上具有多个深度级别。当这些在 NetCDF-3 中时,我使用了scipy.io.netcdf。
现在这些文件在 NetCDF-4(“经典”)中,我不能再使用 scipy.io.netcdf,而是转而使用 netCDF4 Python 模块。但是,缓慢是一个问题,我想知道是否有更有效的方法来提取变量的数据范围(最小和最大数据值)?
这是我使用 scipy 的 NetCDF-3 方法:
import scipy.io.netcdf
netcdf = scipy.io.netcdf.netcdf_file(file)
var = netcdf.variables['sea_water_potential_temperature']
min = var.data.min()
max = var.data.max()
这是我使用 netCDF4 的 NetCDF-4 方法:
import netCDF4
netcdf = netCDF4.Dataset(file)
var = netcdf.variables['sea_water_potential_temperature']
var_array = var.data.flatten()
min = var_array.data.min()
max = var_array.data.max()
显着的区别是我必须先将netCDF4中的数据数组展平,而这个操作显然会减慢速度。
有没有更好/更快的方法?
【问题讨论】:
-
不确定真正的原因是什么,但是 scipy.io.netcdf 和 netcdf-python 的代码库是完全不同的。第一个基于 pupynere,如果我没记错的话,它有一些很好的优化。此外,netCDF 的规格与版本相比发生了很大变化。 3 -> 4. 我想你可以尝试类似
np.array(var.data).max()的方法来避免netCDF Variable的扁平化。很难说,因为netCDF文件的结构是未知的。 -
为什么要展平阵列?
import numpy as np; np.max(var[:])有效吗? -
谢谢。我想扁平化不是瓶颈。通过
var[:]访问数组是。 @abudis:为了工作,我不得不将你的命令修改为np.array(var[:].data).max()。 @SpencerHill:是的,这可行,但同样慢。这两个建议每个都花费与我上面的示例相同的时间:仍然很慢。我想@abudis 提到的 scipy 优化和 netCDF4 更改可能是罪魁祸首。 -
@JohnMaurer 仅供参考
var[:]已经是numpy.ndarray,因此无需在其上调用np.array()函数或访问其data属性。只需var[:].max()就可以了。不过,这对计算速度没有帮助。不会立即想到更快的方法,但其他更专业的用户可能知道。 -
如何使用
nco运算符之一,称为子进程?比如:ncwa -y max ...