有没有方便的方法用ncap2转换多种数据类型?
Is there a convenient way to convert multiple data types with ncap2?
我想知道是否存在一种方便地转换文件的多种数据类型的方式,例如使用ncap2.
更详细地说,我想将类型为double
的所有变量转换为类型float
。
我知道这样做的方法是 ncap2 -s 'var1=var1.convert(NC_FLOAT);var2=var2.convert(NC_FLOAT)' in.nc out.nc
但是当有很多变量时这并不方便。
有没有更聪明的方法来做到这一点?
干杯
好问题。使用 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
在下面的评论中回答问题:
您的尝试无效,因为 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
CDO 也允许转换为 32 位浮点数,尽管我应该强调这并不能完全回答问题,因为它将 everything 转换为浮点数,所以查理的答案是正确的第一,这更多的是为这个问题的读者提供一般信息。
cdo -b f32 copy in.nc out.nc
我想知道是否存在一种方便地转换文件的多种数据类型的方式,例如使用ncap2.
更详细地说,我想将类型为double
的所有变量转换为类型float
。
我知道这样做的方法是 ncap2 -s 'var1=var1.convert(NC_FLOAT);var2=var2.convert(NC_FLOAT)' in.nc out.nc
但是当有很多变量时这并不方便。
有没有更聪明的方法来做到这一点?
干杯
好问题。使用 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
在下面的评论中回答问题:
您的尝试无效,因为 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
CDO 也允许转换为 32 位浮点数,尽管我应该强调这并不能完全回答问题,因为它将 everything 转换为浮点数,所以查理的答案是正确的第一,这更多的是为这个问题的读者提供一般信息。
cdo -b f32 copy in.nc out.nc