【问题标题】:Is there a convenient way to convert multiple data types with ncap2?有没有一种方便的方法可以用 ncap2 转换多种数据类型?
【发布时间】:2021-07-14 16:26:42
【问题描述】:

我想知道是否存在一种方便地转换文件的多种数据类型的方法,例如ncap2
更详细地说,我想double 类型的所有变量转换为float 类型。

我知道这样做的方法是ncap2 -s 'var1=var1.convert(NC_FLOAT);var2=var2.convert(NC_FLOAT)' in.nc out.nc,但是当有很多变量时这并不方便。 有没有更聪明的方法来做到这一点?

干杯

【问题讨论】:

  • 如果您这样做是为了节省空间,您可以尝试的另一件事是 netcdf4 zip 压缩,例如cdo -f nc4 -z zip_9 复制 in.nc out.nc
  • 谢谢阿德里安!我正在考虑使用ncap2 内置-L n 选项来选择n 级通货紧缩。不过,我希望数据类型 no 是双精度浮点数。
  • 恐怕我知道在 cdo 中执行此操作的唯一方法是使用 selvar 提取变量,转换为浮点数,然后使用 cat 粘在一起。但这非常笨拙,所以我认为基于 nco 的解决方案可能会更好。

标签: netcdf nco


【解决方案1】:

好问题。使用here 描述的“变量指针”又名“vpointers”相对容易做到这一点。试试这个:

ncap2 -s '@all=get_vars_in();*sz=@all.size();for(*idx=0;idx<sz;idx++){@var_nm=@all(idx);*@var_nm=*@var_nm.convert(NC_FLOAT);}' in.nc out.nc

回答以下cmets中的问题:

您的尝试不起作用,因为 convert() 在 RHS 上进行了更改。 RHS 更改在保存在 LHS 变量中之前是不稳定的。脚本中的一个小改动可以解决这个问题:

ncap2 -s '@all=get_vars_in();*sz=@all.size();*idx=0;for(idx=0;idx < sz;idx++){@var_nm=@all(idx);if(*@var_nm.type() == NC_DOUBLE) *@var_nm=*@var_nm.float();}' in.nc out.nc

另请注意,ncpdq 似乎是最适合您使用的运算符,因为它有一个 packing map 可以自动将所有双精度数转换为浮点数,同时您也可以轻松启用压缩:

ncpdq -7 -L 1 --pck_map=dbl_flt in.nc out.nc

【讨论】:

  • 谢谢!!该链接对我不起作用,我在 nco.sourceforge.net/nco.html#Vpointer 找到了文档。
  • 我刚刚尝试了脚本,它实际上将每个变量都转换为floats。但是,我只想转换 double 类型的变量。我尝试了以下方法:ncap2 -s'@all = get_vars_in();*sz = @all.size();*idx=0;for (*idx = 0; idx &lt; sz; idx++){@var_nm = @all(idx);if (*@var_nm.type() == NC_DOUBLE){*@var_nm=*@var_nm;*@var_nm.convert(NC_FLOAT);}}' file.in file.out,但它似乎没有改变原始文件的任何内容。
【解决方案2】:

CDO 也允许转换为 32 位浮点数,尽管我应该强调这并不能完全回答问题,因为它将 everything 转换为浮点数,所以查理的答案是正确的,这是更多为这个问题的读者提供一般信息。

cdo -b f32 copy in.nc out.nc 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2016-02-06
    • 2021-02-21
    • 1970-01-01
    • 2010-09-06
    • 2020-01-21
    相关资源
    最近更新 更多