использовать маску с одним временным интервалом для маскирования другой переменной с несколькими временными шагами? - PullRequest
0 голосов
/ 28 октября 2018

Мне нужно замаскировать переменную в файл var.nc, используя маску Landsea из mask.nc

Я использую NCO следующим образом:

ncks -h -A -v mask_var mask.nc var.nc
ncap2 -h -s 'where(mask_var!=1) var_to_mask= var_to_mask@_FillValue' IN.nc OUT.nc

Проблема заключается вколичество временных шагов, на которых определены переменные.В частности,

mask_var(t,y,x) with t=1
var_to_mask(t,y,x,) with t=12

Итак, первая команда правильно копирует mask_var для t = 1;для t> 1 mask_var равен NaN.

Есть ли способ скопировать mask_var для всех других временных шагов?

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

В NCO ncap2 ранг переменной в условии where() должен совпадать с рангом переменной в предложении.Я думаю, что это объясняет поведение, которое вы видите, и я думаю, что вы можете решить эту проблему, сначала создав маску того же ранга, что и переменная, а затем используя эту маску:

ncks -h -A -v mask_var mask.nc var.nc
ncap2 -h -s 'big_mask_var=0*var_to_mask+mask_var;where(big_mask_var!=1) var_to_mask= var_to_mask@_FillValue' IN.nc OUT.nc

NB: big_mask_varкак переменная RAM, которая не будет отображаться в OUT.nc.Упражнение осталось для читателя.

0 голосов
/ 29 октября 2018

Я не очень хорош в NCO, но я думаю, что вы также можете легко сделать это в CDO и рискну найти альтернативный ответ, основанный на этом.Вы не сказали четко в своем вопросе, что такое маска и как вы хотите ее маскировать, но из имеющегося у вас кода я понимаю, что

  • файл маски имеет плавающую переменную между 0 и 1
  • вы хотите сохранить только значения переменных, где mask = 1, и установить все остальное как пропущенное (а не ноль)?

Если это так, то вы можете сделать это:

cdo setrtomiss,-999,0.999 mask.nc maskmiss.nc
cdo mul maskmiss.nc var.nc varmasked.nc

В первой строке задается маска с пропущенными 0,999 и ниже, в противном случае значение остается неизменным, а вторая умножается.CDO автоматически «заполняет» пропущенные временные интервалы путем дублирования, если один файл имеет только один временной шаг, что позволяет обойти вашу проблему.Если вас беспокоит округление (или ваша маска имеет значения> 1), тогда определение более безопасной маски будет

cdo gec,1 mask.nc mask2.nc
cdo setctomiss,0 mask2.nc mask3.nc  

mask2, в этом случае содержит 1, если оригинал был> = 1, и 0 в противном случае, чтозатем сопоставляется с отсутствующим на втором шаге.

Я думаю, что вы можете передать все это в одну команду и избежать промежуточных файлов следующим образом:

cdo mul -setctomiss,0 -gec,1 mask.nc var.nc varmasked.nc 

Еще одна вещь какСноска, на всякий случай, если она представляет интерес, также легко создать маску суши и моря на лету в CDO, используя встроенный набор топографических данных, согласно моему ответу здесь: NetCDF: Как замаскировать / отфильтроватьзначения не земельных участков в глобальном наборе данных, предпочтительно с использованием Python и / или NCO? Это может быть очень полезно, поскольку у вас иногда нет набора данных маски с тем же разрешением, и это позволяет вам точно переназначить маску более крупного масштаба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...