Как сохранить вывод ncdump -v как объект? - PullRequest
0 голосов
/ 14 октября 2019

Я использую ncap2 для генерации среднего и стандартного отклонения заданной переменной (например: nsmz ) из заданного файла (например: NB_all_var_surface_04750.nc ).

Я хотел бы сохранить выходные значения, сгенерированные ncdump, в качестве объектов;Прямо сейчас мне приходится вручную копировать каждый вывод терминала в отдельный массив в отдельном блокноте Jupyter. Должен быть более быстрый путь!

Пожалуйста, смотрите команды оболочки ниже;какие-нибудь мысли?

Редактировать : Для ясности я намеревался добавить значение nsmz_mean в список или иным образом назвать значение nsmz_mean "object1" для дальнейшего использования (потому что яесть много файлов с множеством уникальных значений). Это питонские желания, и я смог найти ответ, выйдя за пределы bash.

ncap2 -h -O -s  'nsmz_mean=nsmz.avg();' NB_all_var_surface_0*.nc NB_nsmz_surface_mean.nc
ncdump -v nsmz_mean NB_nsmz_surface_mean.nc | sed -e '1,/data:/d' -e '$d'

$ nsmz_mean = 1.473794e-07 ;

ncap2 -s 'nsmz_sdn=(nsmz-nsmz.avg(ocean_time)).rmssdn(ocean_time)' NB_all_var_surface_0*.nc NB_nsmz_surface_sdn.nc
ncdump -v nsmz_sdn NB_nsmz_surface_sdn.nc | sed -e '1,/data:/d' -e '$d'

$ nsmz_sdn = 1.247375e-07 ;

1 Ответ

0 голосов
/ 16 октября 2019

Обратите внимание, что ответ, отправленный Линдсей на ее собственный вопрос, к сожалению, не даст правильный ответ, за исключением исключительного обстоятельства данных на декартовой сетке. В большинстве случаев проекция будет регулярной широтой, или уменьшенной гауссовой или одной из многих проекций региональной карты, и в этом случае простое среднее арифметическое значение по массиву пустышек будет неправильным, поскольку оно не учитывает весовые значения размера ячейки сетки (например,ячейки становятся «уже» к полюсам в регулярной решетке широты. Чем больше область, которую вы усредняете, тем хуже становится эта ошибка. См., Например, мой ответ, размещенный здесь: Рассчитать среднее значение переменных в выборочной области, в файле netCDF с сеткой

Я предполагаю, что ncap2 рассчитает среднее пространственное значение для сетки, я знаю, что CDO определенно делает,так что было бы лучше зациклить файлы сначала в bash

for file in NB_all_var_surface_*.nc ; do 
    # appends _mean to each file name for output
    cdo fldmean $file $file%???}_mean.nc 
done

, а затем в вашей программе на python просто зациклить файлы:

from glob import glob
from netCDF4 import Dataset
import numpy as np

files=glob("NB_all_var_surface_*mean.nc")
for file in files:
    ds = Dataset(test)
    mymean = ds.variables['nsmz'] 

    ...append to numpy array etc etc 

Второй вариант - использоватьМодуль Python xarray, так как он специально написан с учетом структур данных netcdf, вот ссылка на руководство, описывающее математические операции: http://xarray.pydata.org/en/stable/computation.html

...