python - 快速读取变量的非连续子集

标签 python python-3.x numpy netcdf

我有一个netCDF4.Variable对象:

<class 'netCDF4._netCDF4.Variable'>
int16 myvar(time, latitude, longitude)
    standard_name: my_var
    long_name: Something
    units: (0 - 1)
    add_offset: 0.499999843485
    scale_factor: 1.54488841466e-05
    _FillValue: -32767
    missing_value: -32767
unlimited dimensions: time
current shape = (13148, 1441, 2880)
filling off

此变量是一个 3D 变量,其中第一个维度是时间维度,另外两个维度是空间维度。

我想访问此变量的子集,其中包含:

  • 时间范围的子集(例如从 70008000)。
  • 由空间范围的扁平版本中的索引标识的点的子集 - 在上面的示例中,索引的范围在 01441 * 2880 之间.

基本上,我有:

tmin = 7000
tmax = 8000
upts = [42829, 9289, 3242]

我当前的访问方式是:

z = np.zeros(len(upts),  tmax - tmin)
for i in range(tmin, tmax):
    z[:, i - tmin] = my_var[i, :, :].flatten()[upts]

我想知道是否有更快的方法来做到这一点?

我无法将整个数据集加载到内存中,因为它已经很大,并且可能会更大。

我也不能仅使用单个 i,因为我想对 z 行进行操作(对应于 my_var 中的“列” >).

最佳答案

不确定这是否在内存方面有效,但是您是否会考虑首先使用 NCO 或 CDO 从 python 之外的命令行剪切文件,然后从 python 读取该文件?这取决于您是否需要重复访问文件的不同 block ,或者这是否是一次性访问。

NCO 中 hyperslab 的命令是

ncks -d dim_name,val1,val2 in.nc -O out.nc 

如果 val 是整数,则使用索引完成切割,如果它是 float ,则根据维度值完成切割。您可以在参数列表上放置多个维度。 (如本答案所示:NCO cropping a netcdf file using dimension values rather than indices)

CDO 需要您似乎拥有的标准尺寸、纬度、经度和时间,因此您可以使用 切割经纬度框和一系列时间步长

cdo seltimestep,7000,8000 -sellonlatbox,lon1,lon2,lat1,lat2 in.nc out.nc

CDO 的优点是您还可以使用日期格式来缩短时间。所以你可以使用

从 7000 减少到 8000
cdo seldate,yyyymmdd,yyyymmdd in.nc out.nc

我发现这非常有用。

根据我的经验,当 NCO 工作正常时,CDO 似乎会因内存需求而窒息,因此这可能会影响您的选择。无论如何,如果您需要重复挑选文件的不同部分,这个建议对您来说不是很有用,但希望对其他人可能有用。

关于python - 快速读取变量的非连续子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48525724/

相关文章:

python - 发布日期、经理和关系

python - 卷积网络模型不适用于非常简单的数据

python - Conda 环境可发现但不可激活(当激活是 bash 别名时)

python - 过滤表的算法

python - 我正在将一组N值传递给循环,但无法获取它以打印输出

python - 在 numpy 中转置 4 维数组

python - 用 scipy 反转大型稀疏矩阵

Python Selenium - 'Unable to locate element' 可见后

python - 查找Docker镜像的依赖项

python - 如何忽略迁移但 __init_.py?