Как инициализировать многомерные массивы для использования 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

Тем не менее, выполнение такого большого количества кода может привести к взрыву вашей головы.

Другие вопросы по тегам