使用 R 扩展 netCDF 文件中的维度
Extend dimensions in netCDF file using R
我想使用 R 编写一个具有 'unlimited' 维度的 netCDF 文件,以后可以扩展。
这是我试过的:
创建 netcdf 文件
library(ncdf4)
## define lat, lon time dimensions
lat <- ncdim_def("latitude", "degrees_east", vals = 44.0, unlim = TRUE)
lon <- ncdim_def("longitude", "degrees_north", vals = -88.5, unlim = TRUE)
time <- ncdim_def("time", "days since 0000-01-01", 1:1000)
## define data with these dimensions
x <- ncvar_def("myvar", units = "m2", dim = list(lat, lon, time))
## create, write to, close nc file
nc <- nc_create(filename = "tmp.nc", vars = list(x))
ncvar_put(nc = nc, varid = x, vals = 1:1000)
nc_close(nc = nc)
我想在不同的纬度和经度添加一个新矢量
## reopen existing file
nc <- nc_open("tmp.nc", write = TRUE)
## define new lat, lon dimensions (keep time dim from above)
lat2 <- ncdim_def("latitude", "degrees_east", vals = 44.5, unlim = TRUE)
lon2 <- ncdim_def("longitude", "degrees_north", vals = -89.0, unlim = TRUE)
## define, write new dataset at new lat lon coordinates
x2 <- ncvar_def("myvar", units = "m2", dim = list(lat2, lon2, time))
ncvar_put(nc = nc, varid = x2, vals = 11:1011)
我希望找到两个不同的纬度和经度
ncvar_get(nc, 'latitude')
ncvar_get(nc, 'longitude')
ncvar_get(nc, 'myvar')
这些表明文件是使用第一组 lat/lon 和 'myvar' 值编写的,但没有附加新的一组值。
我做错了什么?
我知道具有多个无限维度并添加到它们的能力是 netCDF-4 的一个特性。我如何在 R 中执行此操作?
我意识到我一定是将 'dimension definition' 与其他一些概念混淆了。但是我有点迷茫。
是的,我认为您混淆了维度变量中的 'dimension definition' 和实际数据。
如果您 运行 您的第一段代码,然后使用 ncdump
转储 NetCDF 文件,您将看到:
netcdf tmp {
dimensions:
latitude = UNLIMITED ; // (1 currently)
longitude = UNLIMITED ; // (1 currently)
time = 1000 ;
variables:
double latitude(latitude) ;
latitude:units = "degrees_east" ;
latitude:long_name = "latitude" ;
double longitude(longitude) ;
longitude:units = "degrees_north" ;
longitude:long_name = "longitude" ;
int time(time) ;
time:units = "days since 0000-01-01" ;
time:long_name = "time" ;
float myvar(time, longitude, latitude) ;
myvar:units = "m2" ;
data:
latitude = 44 ;
longitude = -88.5 ;
time = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
...
990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000 ;
myvar =
{{1}},
{{2}},
{{3}},
...
{{1000}} ;
}
维度表示 latitude
和 longitude
是无限的,而 time
维度自 0000-01-01 以来固定为 1000 points/days。这正是你指定的,很好。
所以要添加另一个经纬度。我会再次打开文件,读入当前数据,附加到它然后写回。
library(ncdf4)
nc <- nc_open("tmp.nc", write = TRUE)
lat <- ncvar_get(nc, varid='latitude')
lat <- append(lat, 44.5)
ncvar_put(nc, varid='latitude', vals=lat, start=c(1), count=2)
nc_close(nc)
现在ncdump
将显示两个纬度:
data:
latitude = 44, 44.5 ;
longitude = -88.5 ;
当然,对于大型数据集,您不需要或不想读入所有数据和追加,只需告诉 NetCDF 您希望将其写入何处即可。
library(ncdf4)
nc <- nc_open("tmp.nc", write = TRUE)
lon = -89.0
ncvar_put(nc, varid='longitude', vals=lon, start=c(2), count=1)
nc_close(nc)
现在ncdump
将显示两个纬度和两个经度:
data:
latitude = 44, 44.5 ;
longitude = -88.5, -89 ;
myvar
的数据表示是一个 3D 数组,所以我会做不同的初始写入。我会在创建数据和将其写入文件时指定它的尺寸,如下所示:
data <- array(1:1000, c(1,1,1000))
ncvar_put(nc = nc, varid='myvar', vals=data, start=c(1,1,1), count=c(1,1,1000))
然后追加到第二个经纬度:
data <- array(11:1011, c(1,1,1000))
ncvar_put(nc = nc, varid='myvar', vals=data, start=c(2,2,1), count=c(1,1,1000))
注意
感觉R包对你隐藏的太多了。当您使用 ncdim_def
创建维度时,您可以为其赋值。在我看来,这更像是一个 3 步过程。
- 创建维度。
- 创建一个与该维度关联的变量。
- 向该变量添加数据。
希望对您有所帮助。
我想使用 R 编写一个具有 'unlimited' 维度的 netCDF 文件,以后可以扩展。
这是我试过的:
创建 netcdf 文件
library(ncdf4)
## define lat, lon time dimensions
lat <- ncdim_def("latitude", "degrees_east", vals = 44.0, unlim = TRUE)
lon <- ncdim_def("longitude", "degrees_north", vals = -88.5, unlim = TRUE)
time <- ncdim_def("time", "days since 0000-01-01", 1:1000)
## define data with these dimensions
x <- ncvar_def("myvar", units = "m2", dim = list(lat, lon, time))
## create, write to, close nc file
nc <- nc_create(filename = "tmp.nc", vars = list(x))
ncvar_put(nc = nc, varid = x, vals = 1:1000)
nc_close(nc = nc)
我想在不同的纬度和经度添加一个新矢量
## reopen existing file
nc <- nc_open("tmp.nc", write = TRUE)
## define new lat, lon dimensions (keep time dim from above)
lat2 <- ncdim_def("latitude", "degrees_east", vals = 44.5, unlim = TRUE)
lon2 <- ncdim_def("longitude", "degrees_north", vals = -89.0, unlim = TRUE)
## define, write new dataset at new lat lon coordinates
x2 <- ncvar_def("myvar", units = "m2", dim = list(lat2, lon2, time))
ncvar_put(nc = nc, varid = x2, vals = 11:1011)
我希望找到两个不同的纬度和经度
ncvar_get(nc, 'latitude')
ncvar_get(nc, 'longitude')
ncvar_get(nc, 'myvar')
这些表明文件是使用第一组 lat/lon 和 'myvar' 值编写的,但没有附加新的一组值。
我做错了什么?
我知道具有多个无限维度并添加到它们的能力是 netCDF-4 的一个特性。我如何在 R 中执行此操作?
我意识到我一定是将 'dimension definition' 与其他一些概念混淆了。但是我有点迷茫。
是的,我认为您混淆了维度变量中的 'dimension definition' 和实际数据。
如果您 运行 您的第一段代码,然后使用 ncdump
转储 NetCDF 文件,您将看到:
netcdf tmp {
dimensions:
latitude = UNLIMITED ; // (1 currently)
longitude = UNLIMITED ; // (1 currently)
time = 1000 ;
variables:
double latitude(latitude) ;
latitude:units = "degrees_east" ;
latitude:long_name = "latitude" ;
double longitude(longitude) ;
longitude:units = "degrees_north" ;
longitude:long_name = "longitude" ;
int time(time) ;
time:units = "days since 0000-01-01" ;
time:long_name = "time" ;
float myvar(time, longitude, latitude) ;
myvar:units = "m2" ;
data:
latitude = 44 ;
longitude = -88.5 ;
time = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
...
990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000 ;
myvar =
{{1}},
{{2}},
{{3}},
...
{{1000}} ;
}
维度表示 latitude
和 longitude
是无限的,而 time
维度自 0000-01-01 以来固定为 1000 points/days。这正是你指定的,很好。
所以要添加另一个经纬度。我会再次打开文件,读入当前数据,附加到它然后写回。
library(ncdf4)
nc <- nc_open("tmp.nc", write = TRUE)
lat <- ncvar_get(nc, varid='latitude')
lat <- append(lat, 44.5)
ncvar_put(nc, varid='latitude', vals=lat, start=c(1), count=2)
nc_close(nc)
现在ncdump
将显示两个纬度:
data:
latitude = 44, 44.5 ;
longitude = -88.5 ;
当然,对于大型数据集,您不需要或不想读入所有数据和追加,只需告诉 NetCDF 您希望将其写入何处即可。
library(ncdf4)
nc <- nc_open("tmp.nc", write = TRUE)
lon = -89.0
ncvar_put(nc, varid='longitude', vals=lon, start=c(2), count=1)
nc_close(nc)
现在ncdump
将显示两个纬度和两个经度:
data:
latitude = 44, 44.5 ;
longitude = -88.5, -89 ;
myvar
的数据表示是一个 3D 数组,所以我会做不同的初始写入。我会在创建数据和将其写入文件时指定它的尺寸,如下所示:
data <- array(1:1000, c(1,1,1000))
ncvar_put(nc = nc, varid='myvar', vals=data, start=c(1,1,1), count=c(1,1,1000))
然后追加到第二个经纬度:
data <- array(11:1011, c(1,1,1000))
ncvar_put(nc = nc, varid='myvar', vals=data, start=c(2,2,1), count=c(1,1,1000))
注意
感觉R包对你隐藏的太多了。当您使用 ncdim_def
创建维度时,您可以为其赋值。在我看来,这更像是一个 3 步过程。
- 创建维度。
- 创建一个与该维度关联的变量。
- 向该变量添加数据。
希望对您有所帮助。