R语言数组重排:将三维数组转换为指定维度二维数组
没问题,我来帮你搞定这个数组重塑的需求!先结合你的示例来一步步说明,再适配你实际的大数组。
方法一:用for循环实现(你优先想要的方式)
核心思路是遍历三维数组的每个第三维度切片,把每个切片按行摊平后放到结果数组里。
先拿你的示例数组测试:
# 生成示例数组 set.seed(4) data <- array(rexp(12), dim=c(3,2,2)) # 获取原数组的三个维度 dim_rows <- dim(data)[1] # 3 dim_cols <- dim(data)[2] # 2 dim_slices <- dim(data)[3] # 2 # 初始化结果数组:根据你的示例输出,这里定义为[2,6](每个切片对应一行,共6个元素) # 如果实际想要[6,2],把dim参数改成c(dim_rows*dim_cols, dim_slices)即可 result <- array(NA, dim = c(dim_slices, dim_rows*dim_cols)) # 循环遍历每个切片 for (i in 1:dim_slices) { # 转置切片后转成向量,这样就能按行拼接元素(和你的示例输出顺序一致) result[i, ] <- as.vector(t(data[,,i])) } # 查看结果 print(result)
运行后输出就和你给的示例完全一致啦!
适配你的实际数组[633,333,12]的话,只需要把维度参数对应替换:
# 假设你的实际数组叫big_data dim_rows <- 633 dim_cols <- 333 dim_slices <- 12 # 初始化结果数组,按你说的[633*333,12]也就是[210789,12]来定义 result_big <- array(NA, dim = c(dim_rows*dim_cols, dim_slices)) for (i in 1:dim_slices) { result_big[, i] <- as.vector(t(big_data[,,i])) }
方法二:更简洁的内置函数方法(不用循环,效率更高)
R里有很多内置函数可以直接处理数组重塑,比for循环快不少,尤其适合大数组:
方式1:直接用array重塑维度
利用R数组按列存储的特性,直接调整维度,同时用t()保证元素顺序和你的需求一致:
# 示例数组的情况 result <- array(t(data), dim = c(dim_slices, dim_rows*dim_cols)) # 实际大数组的情况([210789,12]) result_big <- array(t(big_data), dim = c(dim_rows*dim_cols, dim_slices))
方式2:用aperm调整维度顺序后重塑
先把第三维度移到最前面,再摊平前两个维度:
# 示例数组 result <- aperm(data, c(3,1,2)) dim(result) <- c(dim_slices, dim_rows*dim_cols) # 实际大数组 result_big <- aperm(big_data, c(3,1,2)) dim(result_big) <- c(dim_rows*dim_cols, dim_slices)
这两种方法都能快速得到你想要的结果,而且代码更简洁~
内容的提问来源于stack exchange,提问作者Ann M
相关产品推荐
相关产品推荐

