R语言多维数组子集选取:如何保留目标维度结构求助
解决方案:提取多维数组的指定子集并保留目标维度
针对你需要从维度为(720,361,10,276)的数组ensSST中提取前两维的54个指定点,最终得到(54,10,276)维度数组的需求,以下是三种可行的方案:
方案一:预先创建数组并循环填充
这是最直观且不易出错的方法,先定义目标维度的空数组,再逐个填充每个点的后两维数据:
# 创建目标维度的空数组 eSST <- array(NA, dim = c(nrow(lat.lon.ensinds), 10, 276)) # 循环填充每个选中点的后两维数据 for(k in 1:nrow(lat.lon.ensinds)){ eSST[k, , ] <- ensSST[lat.lon.ensinds$lon.inds[k], lat.lon.ensinds$lat.inds[k], , ] }
方案二:使用sapply结合维度调整
利用sapply的simplify="array"参数保留多维结构,再调整维度顺序:
# 提取数据并保留数组结构 eSST <- sapply(1:nrow(lat.lon.ensinds), function(k) { ensSST[lat.lon.ensinds$lon.inds[k], lat.lon.ensinds$lat.inds[k], , ] }, simplify = "array") # 调整维度顺序为(54,10,276) eSST <- aperm(eSST, c(3, 1, 2))
注:sapply默认返回的数组维度是(10,276,54),通过aperm将第三个维度(样本数)移到第一位,即可得到目标维度。
方案三:利用矩阵索引+维度重塑
通过矩阵指定前两维的索引,提取后重塑为目标数组:
# 生成前两维的索引矩阵(每行对应一个(lon, lat)对) inds <- cbind(lat.lon.ensinds$lon.inds, lat.lon.ensinds$lat.inds) # 提取所有选中点的后两维数据(返回向量) temp_data <- ensSST[inds] # 将向量重塑为目标维度的数组 eSST <- array(temp_data, dim = c(54, 10, 276))
原方法问题说明
- 方法一:
sapply默认将每个(10,276)的数组摊平为长度2760的向量,最终得到二维矩阵(54,2760),转置后仍无法恢复三维结构。 - 方法二:
rbind会将每个(10,276)的数组视为10行的矩阵,54次拼接后得到(540,276)的矩阵,维度不符合预期。
内容的提问来源于stack exchange,提问作者Peter Guttorp
相关产品推荐
相关产品推荐

