将低于阈值的值设置为 netcdf 文件中的阈值

setting values below a threshold to the threshold in a netcdf file

我想将所有低于常数 c 的值设置为 c 本身在 netcdf 文件中:file.nc

使用气候数据运算符 (CDO) 的解决方案是

cdo mul -gec,$c file.nc file.nc t1.nc
cdo add -mulc,$c -ltc,$c file.nc t1.nc output.nc
rm -f t1.nc

但是有没有 neater/shorter 方法来做到这一点?

您可以使用 NCO's ncap2 轻松完成此操作。

例如在file.nc中将x所有100以下的值设为100,在file2.nc中输出:

>>> ncap2 -s 'where(x<100.) x=100;' file.nc -O file2.nc 

将 Python 与 NumPy 和 netCDF4 结合使用,您可以执行以下操作:

import numpy as np
from netCDF4 import Dataset

dataset = Dataset('/path/to/dataset','r+')

data = dataset.variables['data_variable_name'][:]

threshold = 100 # or whatever your constant c is

# np.where(condition, value if true, value if false)
new_data = np.where(data < threshold, threshold, data)

# Write your new data back to the NetCDF file
dataset.variables['data_variable_name'][:] = new_data[:]

dataset.close()

祝你好运!

ncap2的裁剪算子最简洁:

ncap2 -s 'x=x>>100' in.nc out.nc

还有一种更有效的方法可以使用 expr 与气候数据操作员 (CDO) 一起执行此操作。将 this post 中的例子改编为这个问题的具体例子,假设变量的名称是 x 并且常量是 c,那么命令将是这样的:

cdo -expr,'x = ((x > c)) ? x : c' infile.nc outfile.nc

其中?:是三元条件运算符,x ? y : z表示y if x not equal 0, else z。有关运算符和表达式的其他信息,请参见 CDO Manual,第 2.7.1 节。