【问题标题】:How can I specify dimension order when using ncdf4::ncvar_get?使用 ncdf4::ncvar_get 时如何指定维度顺序?
【发布时间】:2014-05-21 14:26:54
【问题描述】:

根据上一个问题 (Faster reading of time series from netCDF?),我重新排列了我的 netCDF 文件以提供快速的时间序列读取 (scripts on github to be cleaned up eventually ...)。

简而言之,为了加快读取速度,我将尺寸从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)顺序,而后者首先看到维度与时间(time, lat, lon)。

举个简单的例子,下载文件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))

更新我的脚本和函数也不错,除了我希望能够从文件中读取数据而不管维度顺序如何。

除了有没有办法概括这个函数,使它独立于维度顺序工作?

【问题讨论】:

    标签: r netcdf


    【解决方案1】:

    在问这个问题时,我想出了这个解决方案,尽管仍有改进的空间:

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

    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])
    

    【讨论】:

      【解决方案2】:

      我最近也遇到了这个问题。我有一个带有这种格式数据的 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的DIM分量的顺序是T,Y,X

      如果我尝试按照 nc_in$dim 中出现的顺序使用索引来获取 pr 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-30
        • 1970-01-01
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-13
        • 1970-01-01
        相关资源
        最近更新 更多