多维数组netcdf图的python平均值

Posted

技术标签:

【中文标题】多维数组netcdf图的python平均值【英文标题】:python average of multidimensional array netcdf plot 【发布时间】:2021-04-18 16:35:28 【问题描述】:

我从 netCDF 文件中读取了一个多维数组。 我需要绘制的变量名为“em”,它有 4 个维度“em(年、组、纬度、经度)”

“组”变量有 2 个值,我只对第一个感兴趣。 所以我需要管理的唯一变量是“年”变量。变量“年”有 17 个值。对于第一个情节,我需要平均前 5 年,对于第二个情节,我必须平均从第 6 年到最后几年。

data = Dataset (r'D:\\Users\\file.nc') 
lat = data.variables['lat'][:]
lon = data.variables['lon'][:]
year = data.variables['label'][:]
group  = data.variables['group'][:] 
em= data.variables['em'][:]

如何为这个数组创建一个二维数组? 第一个:

`em= data.variables['em'][0:4][0][:][:]`

第二个:

em= data.variables['em'][5:16][0][:][:]

我创建了一个简单的循环

nyear=(2005-2000)+1
for i in range (nyear):
    em_1= data.variables['em'][i][0][:][:]
    em_1+=em_1
em_2000_2005=em_1/nyear

但我认为在 python 上可以有更优雅的简单方法

【问题讨论】:

【参考方案1】:

我强烈建议使用xarray 处理 NetCDF 文件。您可以按名称对其进行操作,而不是按位置跟踪索引,这大大提高了代码的可读性。在您的示例中,您需要做的就是

import xarray as xr

ds = xr.open_dataset(r'D:\\Users\\file.nc')
em_mean1 = ds.em.isel(label = range(6,18)).mean()
em_mean2 = ds.em.isel(label = range(6)).mean()

.isel 方法选择指定维度(在本例中为标签)的索引,.mean() 方法计算选择的平均值。

【讨论】:

【参考方案2】:

你可以使用 NumPy:

em = data.variables['em'][:];
em_mean = np.mean(em,axis=0) # if you want to average all over first dimension

如果数据包含 NaN,只需使用 NumPY 的 nanmean。

由于您想平均前 3 个值,对于第一种情况,请使用:

em_mean1 = np.squeeze(np.mean(em[0:4,:],axis=0)) 

并采取情节:

em_mean1 = np.squeeze(em_mean1[0,:]);

你可以对第二种情况做类似的事情。

【讨论】:

以上是关于多维数组netcdf图的python平均值的主要内容,如果未能解决你的问题,请参考以下文章

机器学习基于组平均的AGNES算法,支持多维数组,距离用欧式距离

Python:创建多维零数组的多维数组

Python——ndarray多维数组基本操作(1)

机器学习基于组平均的AGNES算法,支持多维数组,距离用欧式距离

在 R 中创建多维 NetCDF

多维数组索引 C++ 中的多维数组