Установка значений от порога до порога в файле netcdf
Я хочу установить все значения ниже константы 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
Но есть ли более аккуратный / короткий способ сделать это?
5 ответов
Вы можете использовать NCO ncap2, чтобы сделать это легко.
Например, установить все значения x
ниже 100 до 100 в file.nc
и вывод в file2.nc
:
>>> ncap2 -s 'where(x<100.) x=100;' file.nc -O file2.nc
Оператор отсечения в ncap2 наиболее лаконичен:
ncap2 -s 'x=x>>100' in.nc out.nc
Чтобы установить все приведенные ниже значения на , вы можете использовать команду Операторов климатических данных (cdo
).
cdo setrtoc,-inf,$c,$c infile.nc outfile.nc
Команда установит все значения в диапазоне между-inf
(минус бесконечность) и$c
. Дополнительная информация поsetrtoc
оператора можно найти в руководстве CDO в разделе 2.15.7 .
Используя 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()
Удачи!
Существует также более эффективный способ сделать это с помощью оператора климатических данных (CDO), используя
expr
. Адаптируя пример из этого сообщения к конкретному примеру из этого вопроса, предполагая, что имя переменной - 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.