如何将raster::brick提取的NetCDF数据还原为(long,lat,time)三维数组?
将R中raster提取的时间×坐标矩阵转换为(long, lat, time)三维数组
解决方案
要把提取得到的时间×坐标矩阵还原为(long, lat, time)三维数组,只需基于提取的经纬度维度长度重塑数组,并调整维度顺序即可,以下是两种实现方式:
方式一:高效无循环实现(推荐)
利用array()重塑数组结构,再通过aperm()调整维度顺序,避免循环提升效率:
# 定义各维度长度 n_lon <- length(extract.lon) n_lat <- length(extract.lat) n_time <- nlayers(nc.data) # 先将nc.extract(坐标×时间)重塑为(lat, lon, time)的临时数组 temp_array <- array(nc.extract, dim = c(n_lat, n_lon, n_time)) # 交换维度得到(long, lat, time)的目标数组 nc_array <- aperm(temp_array, c(2, 1, 3))
方式二:直观循环实现(适合理解逻辑)
通过循环逐个处理每个时间切片,将坐标向量转换为经纬度矩阵,再堆叠为三维数组:
# 定义各维度长度 n_lon <- length(extract.lon) n_lat <- length(extract.lat) n_time <- nlayers(nc.data) # 初始化三维数组 nc_array <- array(NA, dim = c(n_lon, n_lat, n_time)) # 循环填充每个时间切片 for (t in 1:n_time) { # 将当前时间的所有坐标值按行填充为lon×lat矩阵 nc_array[,, t] <- matrix(nc.extract[, t], nrow = n_lon, ncol = n_lat, byrow = TRUE) }
验证结果
完成转换后,可通过以下代码确认维度和数值正确性:
# 检查数组维度是否符合预期 print(dim(nc_array)) # 应输出 c(length(extract.lon), length(extract.lat), nlayers(nc.data)) # 验证第一个经纬度点的第一个时间值是否匹配 print(nc_array[1, 1, 1] == nc.extract[1, 1]) # 应返回TRUE
内容的提问来源于stack exchange,提问作者Catalina Jerez Toledo
相关产品推荐
相关产品推荐

