首页 > 解决方案 > 如何在 MATLAB 的数组中匹配 netCDF 变量的值

问题描述

我是 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')
...

但是如何提取具有上述格式的数组/文件?

标签: arraysmatlabnetcdf

解决方案


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

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

#!/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);

推荐阅读