簡體   English   中英

在 python 中循環遍歷 netcdf 的所有時間步,將計算輸出存儲在數組中並將所有數組合並在一起

[英]Loop through all timesteps of a netcdf in python, store calculation output in array and merge all arrays back together

我有一個包含風的 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。

如果我正確理解您的問題,您想要做的是:

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 天。

請注意,我的vort是一個list ,而不是np.array ,但列表中的每個元素都是一個np.array

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM