Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将ncdump-v的输出存储为对象?_Python_Bash_Numpy_Netcdf_Netcdf4 - Fatal编程技术网

Python 如何将ncdump-v的输出存储为对象?

Python 如何将ncdump-v的输出存储为对象?,python,bash,numpy,netcdf,netcdf4,Python,Bash,Numpy,Netcdf,Netcdf4,我使用ncap2从给定文件(ex:NB_all_var_surface_04750.nc)生成给定变量(ex:nsmz)的平均值和标准偏差 我想将ncdump生成的输出值存储为对象;现在,我必须手动将终端中的每个输出复制到一个单独的Jupyter笔记本中的numpy阵列。必须有一个更快的方法 请参阅下面的shell命令;有什么想法吗 编辑:为了清楚起见,我在这里的目的是在列表中附加nsmz_mean的值,或者将nsmz_mean的值命名为“object1”,以供以后参考(因为我有许多具有许多唯一

我使用ncap2从给定文件(ex:NB_all_var_surface_04750.nc)生成给定变量(ex:nsmz)的平均值和标准偏差

我想将ncdump生成的输出值存储为对象;现在,我必须手动将终端中的每个输出复制到一个单独的Jupyter笔记本中的numpy阵列。必须有一个更快的方法

请参阅下面的shell命令;有什么想法吗

编辑:为了清楚起见,我在这里的目的是在列表中附加nsmz_mean的值,或者将nsmz_mean的值命名为“object1”,以供以后参考(因为我有许多具有许多唯一值的文件)。这些都是蟒蛇式的愿望,我在bash之外找到了答案

ncap2-h-O-s'nsmz_mean=nsmz.avg();'NB_所有变量曲面0*.nc NB_nsmz_曲面平均值.nc
ncdump-v nsmz_平均值NB_nsmz_表面_平均值.nc|sed-e'1,/data:/d'-e'$d'
$nsmz_平均值=1.473794e-07;
ncap2-s'nsmz_sdn=(nsmz nsmz.avg(海洋时间)).rmssdn(海洋时间)'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针对她自己的问题发布的答案很不幸不会给出正确答案,除了笛卡尔网格上的数据例外情况。在大多数情况下,投影将是规则lat-lon、约化高斯或许多区域地图投影中的一种,在这种情况下,numpy阵列上的简单算术平均值是不正确的,因为它无法考虑网格单元大小权重(例如,在规则lat-lon网格中,单元向极点“变窄”)。平均面积越大,错误越严重。参见此处张贴的我的答案:

我假设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数据结构编写的,这里有一个指向描述数学运算的手册的链接:

Hi Lindsay,我可以建议您编辑一下问题,以明确您的确切要求吗?从您发布的python回答来看,您似乎只想将输出转换成一个变量,您也可以在bash中使用variable=$(command)执行此操作,但是从您编写的内容来看,您似乎希望将输出显示在jupyter笔记本中?也许是澄清?嗨,阿德里安,我编辑了它以使其更清晰,并在下面添加了一个解决方案。谢谢你的更正,阿德里安!我曾看到过xarray在netCDF社区里大肆吹捧,但从来没有想过要看一看——这对我不利。我现在用它来提取我需要的值。我删除了错误的答案,以免误导任何人。我没有意识到失真问题,因为我的网格区域相对于地球来说非常小,所以我得到了一个由ncap2提取的相同平均值,正如现在删除的答案中所指出的。我认为,如果我的总网格面积增加,这种情况就会改变。嗨,林赛,是的,没错,如果你使用的是一个非常小的区域,误差是有限的,或者如果你在热带的一个狭长地带,也不是太错。:-)我希望我的回答是有帮助的