如何在MATLAB中匹配数组中的netCDF变量值

问题描述 投票:1回答:1

我是MATLAB和netCDF文件的新手,我认为我陷入了一个简单的问题。我有一个包含5个变量的netCDF文件:纬度,经度,时间,风,mp2

我想使用以下格式在txt文件中提取数据:

latitude  longitude  time  wind  mp2
value     value      value value value  
value     value      value value value
'''
value     value      value value value

到目前为止,我已经使用ncread MATLAB命令存储了netCDF变量,如下所示:

wind = ncread(filename, 'wind')
long = ncread(filename, 'long')
...

但是如何使用上述格式提取数组/文件?

arrays matlab netcdf
1个回答
1
投票

我假设经度,纬度和时间是具有nx,ny和ntime元素的向量。

这是使用Python的一个参数(例如wind)的初始解决方案。添加另一个参数应该相对容易。脚本的第一部分只是生成一些示例数据:

#!/usr/bin/env ipython
import numpy as np
from netCDF4 import Dataset,num2date
# ---------------------
# let us generate random file:
fileout='test.nc'
nx,ny,ntime=5,10,15;
# ----------------------
timeout=np.linspace(0,ntime,ntime);
lon=np.linspace(9.0,30,nx);
lat=np.linspace(54.0,66.,ny);
wind=0.0+20.0*np.random.random((ntime,ny,nx));
mp2=np.random.random((ntime,ny,nx));
# ----------------------
ncout=Dataset(fileout,'w','NETCDF3');
ncout.createDimension('time',None);
ncout.createDimension('lon',nx);
ncout.createDimension('lat',ny);
lonvar=ncout.createVariable('lon','float32',('lon'));lonvar[:]=lon;
latvar=ncout.createVariable('lat','float32',('lat'));latvar[:]=lat;
timevar=ncout.createVariable('time','float64',('time'));timevar[:]=timeout;
wvar=ncout.createVariable('wind','float32',('time','lat','lon'));wvar[:]=wind
ncout.close()
# =============================================
def ncread(filename,varname):
    ncin=Dataset(filename);
    vardata = ncin.variables[varname][:];
    ncin.close()
    return vardata
# ---------------------------------------------
# Convert to text:
lonin=ncread(fileout,'lon'); # read longitude
latin=ncread(fileout,'lat'); # read latitude
timein=ncread(fileout,'time'); # read time
win=ncread(fileout,'wind'); # read wind
# ---------------------------------------------
latm,lonm,timem = np.meshgrid(latin,lonin,timein); # generate matrices of longitude,latitude and time with same dimensions as win
# ---------------------------------------------
dataout=np.concatenate((lonm.flatten()[:,np.newaxis],latm.flatten()[:,np.newaxis],timem.flatten()[:,np.newaxis],win.flatten()[:,np.newaxis]),axis=1) # make one matrice from all the data
np.savetxt('test.txt',dataout); # save data
# ==============================================

这是转换部分的MatLab解决方案:

filename='test.nc'
timein = ncread(filename,'time');
lonin = ncread(filename,'lon');
latin = ncread(filename,'lat');
win = ncread(filename,'wind');
% -----------------------------
[latm,lonm,timem] = meshgrid(latin,lonin,timein);

dataout = [reshape(lonm,numel(win),1),reshape(latm,numel(win),1),reshape(timem,numel(win),1),reshape(win,numel(win),1)];

dlmwrite('test_matlab.txt',dataout);
© www.soinside.com 2019 - 2024. All rights reserved.