gpt4 book ai didi

arrays - 在 R 中的 3 维数组上并行化嵌套 for 循环

转载 作者:行者123 更新时间:2023-12-05 07:48:29 26 4
gpt4 key购买 nike

在 Windows 机器上使用 R,我目前正在一个 3D 数组 (720x360x1368) 上运行一个嵌套循环,它循环通过 d1 和 d2 以在 d3 上应用一个函数并将输出组装到一个具有相似维度的新数组。

在以下可重现的示例中,我将维度减少了 10 倍,以加快执行速度。

library(SPEI)

old.array = array(abs(rnorm(50)), dim=c(72,36,136))

new.array = array(dim=c(72,36,136))

for (i in 1:72) {
for (j in 1:36) {
new.listoflists <- spi(ts(old.array[i,j,], freq=12, start=c(1901,1)), 1, na.rm = T)
new.array[i,j,] = new.listoflists$fitted
}
}

其中 spi() 是 SPEI 包中的一个函数,它返回一个列表列表,其中一个长度为 1368 的特定列表 $fitted 从每个循环增量中用于构建新数组。

虽然这个循环完美无缺,但它需要相当长的时间来计算。我读过 foreach 可用于并行化 for 循环。

但是,我不明白如何实现新数组的嵌套和组装,使新旧数组的dimnames保持一致。

(最后,我希望能够使用 as.data.frame.table( ) 并沿着它们的三个维度合并它们。)

非常感谢任何有关如何使用并行计算实现所需输出的帮助!

干杯
立方体

最佳答案

如果有一个可重现的例子会更好,这是我想出的:

首先创建要使用的集群

cl <- makeCluster(6, type = "SOCK")
registerDoSNOW(cl)

然后创建循环并关闭集群:

zz <- foreach(i = 1:720, .combine = c) %:% 
foreach(j = 1:360, .combine = c ) %dopar% {
new.listoflists <- FUN(old.array[i,j,])
new.array[i,j,] <- new.listoflists$list
}
stopCluster(cl)

这将创建一个包含 new.array[i,j,] 的每个迭代的列表 zz,然后您可以将它们绑定(bind)在一起:

new.obj <- plyr::ldply(zz, data.frame)

希望对你有帮助!

关于arrays - 在 R 中的 3 维数组上并行化嵌套 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38521173/

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