gpt4 book ai didi

arrays - 有效地计算 R 中 3d 数组的行总和

转载 作者:行者123 更新时间:2023-12-04 00:42:54 25 4
gpt4 key购买 nike

考虑数组 a :

> a <- array(c(1:9, 1:9), c(3,3,2))
> a
, , 1

[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9

, , 2

[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9

我们如何有效地计算由第三维索引的矩阵的行和,使得结果是:
     [,1] [,2]
[1,] 12 12
[2,] 15 15
[3,] 18 18

??

列总和很容易通过 'dims' colSums() 的论据:
> colSums(a, dims = 1)

但我找不到使用 rowSums() 的方法在数组上实现所需的结果,因为它对 'dims' 有不同的解释到 colSums() .

使用以下方法计算所需的行总和很简单:
> apply(a, 3, rowSums)
[,1] [,2]
[1,] 12 12
[2,] 15 15
[3,] 18 18

但这只是隐藏了循环。是否有其他有效的、真正矢量化的方法来计算所需的行总和?

最佳答案

@Fojtasek 的回答提到拆分阵列让我想起了 aperm()允许对数组的维度进行置换的函数。如 colSums()有效,我们可以使用 aperm() 交换前两个维度并运行 colSums()在输出上。

> colSums(aperm(a, c(2,1,3)))
[,1] [,2]
[1,] 12 12
[2,] 15 15
[3,] 18 18

这个和其他建议的基于 R 的答案的一些比较时间:
> b <- array(c(1:250000, 1:250000),c(5000,5000,2))
> system.time(rs1 <- apply(b, 3, rowSums))
user system elapsed
1.831 0.394 2.232
> system.time(rs2 <- rowSums3d(b))
user system elapsed
1.134 0.183 1.320
> system.time(rs3 <- sapply(1:dim(b)[3], function(i) rowSums(b[,,i])))
user system elapsed
1.556 0.073 1.636
> system.time(rs4 <- colSums(aperm(b, c(2,1,3))))
user system elapsed
0.860 0.103 0.966

所以在我的系统上 aperm()解决方案出现速度稍快:
> sessionInfo()
R version 2.12.1 Patched (2011-02-06 r54249)
Platform: x86_64-unknown-linux-gnu (64-bit)

然而, rowSums3d()没有给出与其他解决方案相同的答案:
> all.equal(rs1, rs2)
[1] "Mean relative difference: 0.01999992"
> all.equal(rs1, rs3)
[1] TRUE
> all.equal(rs1, rs4)
[1] TRUE

关于arrays - 有效地计算 R 中 3d 数组的行总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5135415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com