首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用ncdf4::ncvar_get时指定维度顺序?

如何在使用ncdf4::ncvar_get时指定维度顺序?
EN

Stack Overflow用户
提问于 2014-04-08 17:57:21
回答 2查看 3.9K关注 0票数 4

在前一个问题(从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并运行

代码语言:javascript
复制
bash-$ ncdump -h .nc
bash-$ R
R> library(ncdf4)
R> print(nc_open("test.nc")

我想做的是从变量"lwdown“中得到5-15的记录。

代码语言:javascript
复制
my.nc <- nc_open("test.nc")

但是这不起作用,因为R首先看到时间维度,所以我必须将我的脚本更改为

代码语言:javascript
复制
ncvar_get(my.nc, "lwdown", start = c(5, 1, 1), count = c(10, 1, 1))

更新我的脚本和函数并不是很糟糕,只是我希望能够从文件中读取数据,而不管维度顺序如何。

除了有方法推广这个函数之外,它是否独立于维数顺序工作呢?

EN

回答 2

Stack Overflow用户

发布于 2014-04-08 17:57:40

在提出问题时,我想出了这个解决办法,尽管仍有改进的余地:

我能得到的最接近的方法是打开文件并以这样的方式查找顺序:

代码语言:javascript
复制
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期望一个任意的命令,我可以说“

代码语言:javascript
复制
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])
票数 3
EN

Stack Overflow用户

发布于 2019-05-23 17:36:09

我最近也碰到了这个。我有一个netcdf,其中包含这种格式的数据。

代码语言:javascript
复制
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的时间序列数据,则会得到一个错误。

代码语言:javascript
复制
ncvar_get(nc_in,"pr")[3653,180,360] # 'subscript out of bounds'

如果我以X,Y,T顺序获取数据,它可以工作:

代码语言:javascript
复制
ncvar_get(nc_in,"pr")[360,180,3653] # gives me a value

我不明白的是,ncvar_get()包是如何知道什么变量代表X、Y和T的,特别是如果您已经生成了自己的netCDF。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22944707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档