裁剪数据 - 将低于阈值的值设置为 netcdf 文件中的阈值

问题描述 投票:0回答:5

我想在 netcdf 文件中将所有低于常量 c 的值设置为 c 本身: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

但是有没有更简洁/更短的方法来做到这一点?

bash netcdf nco cdo-climate
5个回答
6
投票

你可以使用 NCO 的 ncap2 轻松做到这一点。

例如在

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

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

6
投票

ncap2的裁剪算子最简洁:

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

1
投票

还有一种更有效的方法可以使用

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 手册,第 2.7.1.

部分提供了与运算符和表达式相关的其他信息

1
投票

将 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()

祝你好运!


1
投票

要设置

$c
$c
以下的所有值,您可以使用气候数据操作员(
setrtoc
)的
cdo
命令。

cdo setrtoc,-inf,$c,$c infile.nc outfile.nc

该命令会将

-inf
(负无穷大)和
$c
之间的所有值设置为
$c
。有关
setrtoc
运算符的其他信息,请参见 CDO 手册中的 2.15.7 节。

© www.soinside.com 2019 - 2024. All rights reserved.