2014-04-08 58 views
2

繼上一個問題之後(Faster reading of time series from netCDF?)我重新排列了我的netCDF文件以提供快速的時間序列讀取(scripts on github to be cleaned up eventually ...)。如何在使用ncdf4 :: ncvar_get時指定尺寸順序?

總之,爲了使讀取速度更快,我已將尺寸從lat, lon, time重新排列爲time, lat, lon。現在,我現有的腳本打破,因爲他們認爲該尺寸將永遠是lat, lon, time,以下ncvar_get的ncdf4文檔中,「開始」的說法:

秩序是XYZT(即時間維度是最後一個)

但是,事實並非如此。

此外,通過命令行netCDF實用程序ncdump -h和R功能ncdf4::nc_open列出的變量順序存在相關不一致。第一個表示尺寸是預期的(經度,緯度,時間)順序,而後者則用時間先確定尺寸(時間,緯度,經度)。

對於一個小例子,下載文件test.nc和運行

bash-$ ncdump -h .nc 
bash-$ R 
R> library(ncdf4) 
R> print(nc_open("test.nc") 

我想要做的就是從變量「lwdown」

my.nc <- nc_open("test.nc") 

得到記錄5-15不過這並未」因爲R先看到時間維度,所以我必須將腳本更改爲

ncvar_get(my.nc, "lwdown", start = c(5, 1, 1), count = c(10, 1, 1)) 

除了我希望能夠從文件讀取數據而不管維度順序如何,更新我的腳本和函數並不會那麼糟糕。

除了是否有一種方法來概括此函數,使其獨立於維度順序?

回答

2

在問這個問題,我想出了這個解決方案,但仍有改進的餘地:

我能得到最接近的是打開文件,找到這樣的順序:

my.nc$var$lwdown$dim[[1]]$name 
[1] "time" 
my.nc$var$lwdown$dim[[2]]$name 
[1] "lon" 
my.nc$var$lwdown$dim[[3]]$name 
[1] "lat" 

這是一個有點不滿意,但它使我這個解決方案:

如果我想在c(lat = 1, lon = 1, time = 5)開始,但ncvar_get預計任意順序,我可以說」

start <- c(lat = 1, lon = 1, time = 5) 
count <- c(lat = 1, lon = 1, time = 10) 
dim.order <- sapply(my.nc$var$lwdown$dim, function(x) x$name) 

ncvar_get(my.nc, "lwdown", start = start[dim.order], count = count[dim.order])