使用已知索引和值在 R 中快速填充 3D array/matrix

Fast fill 3D array/matrix in R with known index and value

我可以问一个关于在 R 中快速为大型 3D 矩阵赋值的愚蠢问题吗?我有 x、y、z 作为位置索引和 val 作为要填充的值。 for循环需要这么长时间,你能帮忙吗?注意这里我只是模拟了xyz和val

x <- replicate(1e4, sample(seq(1:100), size = 1))
y <- replicate(1e4, sample(seq(1:100), size = 1))
z <- replicate(1e4, sample(seq(1:200), size = 1))
val <- rnorm(1e4, 0, 1)

a <- array(numeric(),c(100, 100, 200))
for(ii in seq(from = 1, to = length(x), by = 1)){
    a[x[ii], y[ii], z[ii]] <- val[ii]
}

我绑定了以下 mapply 但它 returns 对我来说是一个矢量

mapply(function(i, j, k, v) a[i, j, k] <- v, x, y , z, val)

你可以做到

a[cbind(x, y, z)] <- val

很难证明这适用于如此大的示例,所以让我们使用 3 x 3 x 3 矩阵在较小的规模上进行演示:

a <- array(numeric(), c(3, 3, 3))

x <- c(3, 2, 1)
y <- c(1, 1, 1)
z <- c(1, 2, 3)
val <- c(1, 2, 3)

所以这些变量意味着我们想要在第一个切片的第一列的第三行中有一个,在第二个切片的第一列的第二行中有一个二,在第二个切片的第一行中有一个三第三个切片的第一列:

a[cbind(x, y, z)] <- val

a
#> , , 1
#> 
#>      [,1] [,2] [,3]
#> [1,]   NA   NA   NA
#> [2,]   NA   NA   NA
#> [3,]    1   NA   NA
#> 
#> , , 2
#> 
#>      [,1] [,2] [,3]
#> [1,]   NA   NA   NA
#> [2,]    2   NA   NA
#> [3,]   NA   NA   NA
#> 
#> , , 3
#> 
#>      [,1] [,2] [,3]
#> [1,]    3   NA   NA
#> [2,]   NA   NA   NA
#> [3,]   NA   NA   NA

reprex package (v2.0.1)

于 2022-02-24 创建