Как сопоставить значения переменных netCDF в массиве в MATLAB - PullRequest
1 голос
/ 11 апреля 2019

Я новичок в файлах MATLAB и netCDF и думаю, что застрял в легкой проблеме.У меня есть файл netCDF с 5 переменными: широта, долгота, время, ветер, mp2

Я хочу извлечь данные в текстовый файл в следующем формате:

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

До сих пор ясохранили переменные netCDF с помощью команды ncread MATLAB, как показано ниже:

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

Но как мне извлечь массив / файл с указанным выше форматом?

1 Ответ

1 голос
/ 11 апреля 2019

Я предполагаю, что долгота, широта и время - это векторы с элементами 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);
...