如何将 ncdump -v 的输出存储为对象?
How to store the output of ncdump -v as an object?
我正在使用 ncap2 从给定文件(例如:NB_all_var_surface_04750.nc).
我想将 ncdump 生成的输出值存储为对象;现在,我必须手动将终端中的每个输出复制到单独的 Jupyter Notebook 中的 numpy 数组。一定有更快的方法!
请参阅下面的 shell 命令;有什么想法吗?
编辑:为清楚起见,我的目的是在列表中附加 nsmz_mean 的值,或者以其他方式命名 nsmz_mean "object1" 供以后参考(因为我有很多文件有很多唯一值)。这些都是 pythonic 的愿望,我能够通过移出 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 ;
请注意,不幸的是,lindsay 对她自己的问题发布的答案 不会 给出正确答案,除了笛卡尔网格上数据的特殊情况。在大多数情况下,投影将是规则的经纬度投影、缩减高斯投影或许多区域地图投影之一,在这种情况下,对 numpy 数组的简单算术平均是不正确的,因为它没有考虑网格单元大小权重(例如单元格 "narrower" 朝向规则经纬度网格中的两极)。你平均的区域越大,这个错误就越严重。参见例如我的回答贴在这里:Calculate variables mean in a selective area , in gridded netCDF file
我假设 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 数据结构编写的,这里是 link 描述数学运算的手册:http://xarray.pydata.org/en/stable/computation.html
我正在使用 ncap2 从给定文件(例如:NB_all_var_surface_04750.nc).
我想将 ncdump 生成的输出值存储为对象;现在,我必须手动将终端中的每个输出复制到单独的 Jupyter Notebook 中的 numpy 数组。一定有更快的方法!
请参阅下面的 shell 命令;有什么想法吗?
编辑:为清楚起见,我的目的是在列表中附加 nsmz_mean 的值,或者以其他方式命名 nsmz_mean "object1" 供以后参考(因为我有很多文件有很多唯一值)。这些都是 pythonic 的愿望,我能够通过移出 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 ;
请注意,不幸的是,lindsay 对她自己的问题发布的答案 不会 给出正确答案,除了笛卡尔网格上数据的特殊情况。在大多数情况下,投影将是规则的经纬度投影、缩减高斯投影或许多区域地图投影之一,在这种情况下,对 numpy 数组的简单算术平均是不正确的,因为它没有考虑网格单元大小权重(例如单元格 "narrower" 朝向规则经纬度网格中的两极)。你平均的区域越大,这个错误就越严重。参见例如我的回答贴在这里:Calculate variables mean in a selective area , in gridded netCDF file
我假设 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 数据结构编写的,这里是 link 描述数学运算的手册:http://xarray.pydata.org/en/stable/computation.html