【问题标题】:How to match netCDF variables' values in an array in MATLAB如何在 MATLAB 的数组中匹配 netCDF 变量的值
【发布时间】:2019-09-01 18:20:31
【问题描述】:

我是 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】:

    我假设经度、纬度和时间是具有 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);
    

    【讨论】:

      猜你喜欢
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 2013-06-29
      • 2011-05-02
      • 2020-01-10
      • 2015-02-07
      • 2014-10-21
      相关资源
      最近更新 更多