如何用优雅高效的方法提取R语言中3D数组的全部对角线?
3D数组对角线的高效分组方法
核心思路
和2D矩阵利用行索引-列索引分组对角线的思路类似,3D数组中,同一对角线上的元素满足:行索引与列索引的差值固定,且列索引与层索引的差值固定(每沿对角线移动一步,行、列、层索引同步+1,因此行-列、列-层的数值始终不变)。我们可以通过这两个差值的组合作为分组键,实现高效的对角线提取。
代码实现
# 定义示例3D数组 arr <- array(1:60, dim = c(5, 4, 3)) # 构造三个维度的索引矩阵 row_idx <- row(arr) col_idx <- col(arr) slice_idx <- array(rep(1:dim(arr)[3], each = prod(dim(arr)[1:2])), dim = dim(arr)) # 计算分组键:行-列、列-层的差值组合 group_key <- interaction(row_idx - col_idx, col_idx - slice_idx) # 按分组键拆分数组,得到所有对角线列表 diagonals_3d <- split(arr, group_key)
结果验证
提取几个示例对角线验证:
- 对应
[1,1,1]的分组键为0.0,取值:diagonals_3d[["0.0"]]→c(1, 27, 53) - 对应
[3,2,1]的分组键为1.1,取值:diagonals_3d[["1.1"]]→c(8, 34, 60) - 对应
[1,3,1]的分组键为-2.2,取值:diagonals_3d[["-2.2"]]→c(11, 37) - 对应
[1,2,2]的分组键为-1.0,取值:diagonals_3d[["-1.0"]]→c(26, 52)
该方法完全基于向量运算,避免了循环迭代,和2D场景的解决方案保持了同样的优雅与高效。
内容的提问来源于stack exchange,提问作者Tripartio
相关产品推荐
相关产品推荐

