You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:32:36