在前一个问题(从netCDF更快地读取时间序列?)之后,我重新安排了netCDF文件,以提供快速的时间序列读取(github上的脚本最终会被清理..。)。
简而言之,为了使读取速度更快,我将维度从lat, lon, time重新排列为time, lat, lon。现在,我的现有脚本中断了,因为它们假设维度始终是lat, lon, time,遵循ncvar_get的ncdf4文档,用于“开始”参数:
阶为X-Y-Z-T (即时间维数为最后)
然而,情况并非如此。
此外,通过命令行netCDF实用程序ncdump -h和R函数ncdf4::nc_open列出的变量顺序存在相关的不一致性。第一个维度是按照预期的(lat,lon,time)顺序的,而后者是第一次看到维度(时间,时间,时间)。
对于一个最小的例子,下载文件test.nc并运行
bash-$ ncdump -h .nc
bash-$ R
R> library(ncdf4)
R> print(nc_open("test.nc")我想做的是从变量"lwdown“中得到5-15的记录。
my.nc <- nc_open("test.nc")但是这不起作用,因为R首先看到时间维度,所以我必须将我的脚本更改为
ncvar_get(my.nc, "lwdown", start = c(5, 1, 1), count = c(10, 1, 1))更新我的脚本和函数并不是很糟糕,只是我希望能够从文件中读取数据,而不管维度顺序如何。
除了有方法推广这个函数之外,它是否独立于维数顺序工作呢?
发布于 2014-04-08 17:57:40
在提出问题时,我想出了这个解决办法,尽管仍有改进的余地:
我能得到的最接近的方法是打开文件并以这样的方式查找顺序:
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])发布于 2019-05-23 17:36:09
我最近也碰到了这个。我有一个netcdf,其中包含这种格式的数据。
nc_in <- nc_open("my.nc")
nc_in$dim[[1]]$name == "time"
nc_in$dim[[2]]$name == "latitude"
nc_in$dim[[3]]$name == "longitude"
nc_in$dim[[1]]$len == 3653 # this is the number of timesteps in my netcdf
nc_in$dim[[2]]$len == 180 # this is the number of longitude cells
nc_in$dim[[3]]$len == 360 # this is the number of latitude cells令人讨厌的是,netCDF的昏暗成分是按T,Y,X顺序排列的。
如果我试图使用 nc_in$dim中索引的顺序来获取pr nc_in$dim var的时间序列数据,则会得到一个错误。
ncvar_get(nc_in,"pr")[3653,180,360] # 'subscript out of bounds'如果我以X,Y,T顺序获取数据,它可以工作:
ncvar_get(nc_in,"pr")[360,180,3653] # gives me a value我不明白的是,ncvar_get()包是如何知道什么变量代表X、Y和T的,特别是如果您已经生成了自己的netCDF。
https://stackoverflow.com/questions/22944707
复制相似问题