gpt4 book ai didi

R,从高维数组中选择子矩阵序列

转载 作者:行者123 更新时间:2023-12-04 21:18:42 26 4
gpt4 key购买 nike

A 是一个 4 维数组,dim 为 100*100*100*100。我想从 A 的最后两个维度中选择 10000 个子矩阵。 B 和 C 是长度为 10000 的向量。它们是选择标准。 B 指定 A 的行号,C 指定列号。

A <- array(rnorm(100^4), dim=c(100,100,100,100))
B <- sample( nrow(A) , 10000 , repl = TRUE )
C <- sample( ncol(A) , 10000 , repl = TRUE )
D <- array(0, dim=c(10000,100,100))

使用 for 循环:
system.time(
for ( i in 1:10000 ){
D[i,,] <- A[B[i],C[i],,]
})

user system elapsed
10.20 0.14 10.34

与映射:
sub_array <- function(b,c) return(A[b,c,,])
system.time(D <- mapply(FUN = sub_array, B, C, SIMPLIFY='array'))

user system elapsed
9.77 3.75 29.17

这甚至更慢。有没有更快的方法来做到这一点?谢谢。

最佳答案

诀窍是重新调暗A到一个 3D 数组中,这样你就可以使用我们所说的“正常”索引。

一些示例数据:

n <- 60
A <- array(rnorm(n^4), dim=c(n,n,n,n))
B <- sample( nrow(A) , n^2 , repl = TRUE )
C <- sample( ncol(A) , n^2 , repl = TRUE )
D <- array(0, dim=c(n^2,n,n))

OP的方法:
system.time({
D <- array(0, dim=c(n*n, n, n))
for ( i in 1:(n*n) ) D[i,,] <- A[B[i],C[i],,]
})
# user system elapsed
# 2.33 0.08 2.41

建议的解决方案:
system.time({
d <- dim(A)
dim(A) <- c(prod(d[1:2]), d[3:4])
D2 <- A[B + d[1]*(C-1),,]
})
# user system elapsed
# 0.37 0.06 0.44

我们检查结果是否相同:
identical(D, D2)
# [1] TRUE

关于R,从高维数组中选择子矩阵序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16721120/

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