Как инициализировать многомерные массивы для использования Julia ncread() для одной и той же переменной в разных файлах?
Я использую пакет NetCDF в Julia 0.5.0 для чтения одной и той же многомерной переменной из ~10 разных файлов netcdf. Есть ли лучший способ циклически просматривать файлы и объединять их в один всеобъемлющий многомерный массив, а не создавать массив массивов, как у меня сейчас?
В настоящее время мой код настроен так:
files = ["file1", "file2", "file3", ... , "file10"]
#length(files) = 10
var = Array{Array}(10)
for i in collect(1:1:10)
var[i] = ncread(files[i], "x")
end
где
size(var) = 10
size(var[1]) = (192,59,193) #from file1
.
.
.
size(var[10]) = (192,59,193) #from file10
который работает, но не является желаемым форматом, потому что позже я хочу взять средние по измерению Y в том, что в настоящее время является подмассивами. В идеале я хотел бы использовать ncread()
читать x
в один многомерный массив var
такой, что размер выглядит
size(var) = (10,192,59,193)
где
var[1,:,:,:] #from file1
.
.
.
var[10,:,:,:] #from file10
я думаю что hcat()
или же push!()
может понадобиться, но я не уверен, как инициализировать многомерные массивы перед циклом for для учета ncread()
выход? Я должен сделать это для ~8 переменных в файлах, и я не знаю размеры или длины различных переменных до вызова ncread()
,
2 ответа
filenames = ["file$i" for i = 1:10]; # make some filenames
ncread(filename) = rand(2,3,4) # define a dummy function similar to yours
a = ncread(filenames[1]) # read the first file to get the size
output = Array{Float64}(length(filenames),size(a)...); #preallocate the full array, lookup splatting to see how this works
output[1,:,:,:] = a # assign the data we already read
for i in 2:length(filenames) # read and assign the rest
output[i,:,:,:] = ncread(filenames[i])
end
NCO использует ncecat для этого:
ncecat in*.nc out.nc
Тем не менее, выполнение такого большого количества кода может привести к взрыву вашей головы.