首页 > 解决方案 > 循环遍历python中netcdf的所有时间步,将计算输出存储在数组中并将所有数组重新合并在一起

问题描述

我有一个包含风的 u 和 v 分量的 netcdf 文件。netcdf 文件包含 7305 个每日值。对于每一天我想做一些计算,将输出存储在一个数组中,然后合并所有数组,这样每个数组都会对应一个特定的日子。初始 netcdf 文件有 lats(101) 和 lons(129)。所以最终的数组 (vort) 将有 (7305,101,129) 个维度。下面我已经包含了我到目前为止开发的代码。如果我将每一天单独存储在 vort 中,它会起作用,但当我“追加”时不起作用。有什么帮助吗?

from matplotlib import pyplot
from matplotlib.cm import get_cmap
from __future__ import print_function
from netCDF4 import Dataset,num2date,date2num
from matplotlib.colors import from_levels_and_colors
from cartopy import crs
from cartopy.feature import NaturalEarthFeature, COLORS
from metpy.units import units
from datetime import datetime
from metpy.plots import StationPlot
#
import metpy.calc as mpcalc
import xarray as xr
import cartopy.crs as ccrs
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
import datetime
import cartopy.feature as cfeature
import mygrads as mg
#
#
root_dir = '/users/pr007/mkaryp/'
nc = Dataset(root_dir+'ERA5_ensmean_daymean.nc')
#
lon=nc.variables['longitude'][:]
lat=nc.variables['latitude'][:]
#
dx, dy = mpcalc.lat_lon_grid_deltas(lon, lat)
#
u = []
v = []
vort = np.array([])
#
for i in range(7305):
    v = np.array(nc.variables['v'][i,:,:])                    
    u = np.array(nc.variables['u'][i,:,:]) 
    #   
    v = units.Quantity(v, 'm/s')
    u = units.Quantity(u, 'm/s')
    #
    # Compute dx and dy spacing for use in divergence calculation
    vort1 = np.array(mpcalc.vorticity(u, v, dx=dx, dy=dy))
    vort = np.append([vort, vort1])
    #
    print(i)

编辑 使用的数据文件的子样本可以在这里找到。这个 netcdf 文件有 10 个时间步,而不是 7305。

标签: pythonarraysloopsappend

解决方案


如果我正确理解您的问题,您想要做的是:

lon=nc.variables['longitude'][:]
lat=nc.variables['latitude'][:]
#
dx, dy = mpcalc.lat_lon_grid_deltas(lon, lat)
#
u = []
v = []
vort = []
#
for i in range(10):
    v.append(np.array(nc.variables['v'][i,:,:]))                    
    u.append(np.array(nc.variables['u'][i,:,:]))
    v[i] = units.Quantity(v[i], 'm/s')
    u[i] = units.Quantity(u[i], 'm/s')
    vort.append(np.array(mpcalc.vorticity(u[i], v[i], dx=dx, dy=dy)))

您当前的 for 循环正在覆盖每个索引 i 的结果。所以你并没有真正存储所有日子的数据。

您可以使用以下方法检查我的结果:

print(len(vort))
print(vort[0])

长度为 10,这意味着它收集这 10 天的数据,而不是代码中的 1 天。

请注意, myvort是 a list,而不是 a np.array,但列表中的每个元素都是 a np.array


推荐阅读