【问题标题】:How to filter data by dimension in a netCDF file如何在 netCDF 文件中按维度过滤数据
【发布时间】:2020-09-11 09:11:34
【问题描述】:

使用 python,我已经使用 netCDF4 库导入了一个 netCDF 文件...

import netCDF4 as nc
ncObject = nc.Dataset('somefile.nc')

这是 ncObject 的尺寸...

fov(9)
y(100)
x(100)
pressure(100)
cloud_layers(2)

我要做的是按维度或维度系列过滤数据集。所以基本上我希望我的新 ncObject 只包含 fov=0 和 cloud_layers=0 的记录。我知道这可以使用 xarray 模块和下面的代码来完成,但我想使用 netCDF4 包做同样的事情(原因是 netCDF4 在访问组文件夹中的嵌套变量时效果更好)......

ncObjectNew = ncObject.sel(cloud_layers=0).sel(fov=0)

好奇是否有人知道如何使用 netCDF4 表示法/语法编写上述内容。

提前感谢您提供的任何帮助。

杰夫

【问题讨论】:

    标签: python dataframe dataset netcdf netcdf4


    【解决方案1】:

    这个make_subsets 函数应该可以帮助你:

    import netCDF4 as nc
    
    def make_subsets(variables, ranges):
        """
        Inputs:
          variables: dict with key: var name, value: netCDF variable
          ranges: dict with key: dim name, value: 2-tuple of (start, stop) indices
        Returns:
          variables subsetted according to the supplied ranges, in same format as 
          the input variables dictionary
        """
        subsets = {}
        for varname, v in variables.items():
            subset_args = []
            if v.shape:
                for size, dim in zip(v.shape, v.dimensions):
                    if dim in ranges:
                        subset_args.append(slice(*ranges[dim]))
                    else:
                        subset_args.append(slice(0, size))
                print(subset_args)
                subsets[varname] = v.__getitem__(subset_args)
            else:
                # scalar                                                                                
                subsets[varname] = v
        return subsets
    
    
    ncObject = nc.Dataset('somefile.nc')
    
    # start and end values for every dimension we want to subset                                        
    # (as usual, end value is the index AFTER the last element wanted)                                  
    ranges = {'fov': (0, 1), 'cloud_layers': (0, 1)}
    
    subsets = make_subsets(ncObject.variables, ranges)
    
    for varname, v in subsets.items():
        print(varname, v.shape)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多