gpt4 book ai didi

r - 组合迭代器,如 expand.grid

转载 作者:行者123 更新时间:2023-12-01 03:40:28 27 4
gpt4 key购买 nike

是否有一种快速的方法来迭代由 expand.grid 返回的组合?或 CJ ( data.table )。当有足够的组合时,它们会变得太大而无法放入内存。有iproductitertools2库(Python 的 itertools 的端口)但它真的很慢(至少我使用它的方式 - 如下所示)。还有其他选择吗?

这是一个示例,其中的想法是将函数应用于来自两个 data.frames 的行的每个组合。 ( previous post )。

library(data.table)  # CJ
library(itertools2) # iproduct iterator
library(doParallel)

## Dimensions of two data
dim1 <- 10
dim2 <- 100
df1 <- data.frame(a = 1:dim1, b = 1:dim1)
df2 <- data.frame(x= 1:dim2, y = 1:dim2, z = 1:dim2)

## function to apply to combinations
f <- function(...) sum(...)

## Too big to expand with bigger dimensions (ie, 1e6, 1e5) -> errors
## test <- expand.grid(seq.int(dim1), seq.int(dim2))
## test <- CJ(indx1 = seq.int(dim1), indx2 = seq.int(dim2))
## Error: cannot allocate vector of size 3.7 Gb

## Create an iterator over the cartesian product of the two dims
it <- iproduct(x=seq.int(dim1), y=seq.int(dim2))

## Setup the parallel backend
cl <- makeCluster(4)
registerDoParallel(cl)

## Run
res <- foreach(i=it, .combine=c, .packages=c("itertools2")) %dopar% {
f(df1[i$x, ], df2[i$y, ])
}
stopCluster(cl)

## Expand.grid results (different ordering)
expgrid <- expand.grid(x=seq(dim1), y=seq(dim2))
test <- apply(expgrid, 1, function(i) f(df1[i[["x"]],], df2[i[["y"]],]))

all.equal(sort(test), sort(res)) # TRUE

最佳答案

我认为,如果您为每个工作人员提供一个数据帧的块,让他们每个人执行计算,然后组合结果,您将获得更好的性能。这会导致更高效的计算并减少工作人员的内存使用量。

这是一个使用 isplitRow 的示例来自 itertools 的函数包裹:

library(doParallel)
library(itertools)
dim1 <- 10
dim2 <- 100
df1 <- data.frame(a = 1:dim1, b = 1:dim1)
df2 <- data.frame(x= 1:dim2, y = 1:dim2, z = 1:dim2)
f <- function(...) sum(...)

nw <- 4
cl <- makeCluster(nw)
registerDoParallel(cl)

res <- foreach(d2=isplitRows(df2, chunks=nw), .combine=c) %dopar% {
expgrid <- expand.grid(x=seq(dim1), y=seq(nrow(d2)))
apply(expgrid, 1, function(i) f(df1[i[["x"]],], d2[i[["y"]],]))
}

我分了 df2因为它有更多行,但您可以选择其中之一。

关于r - 组合迭代器,如 expand.grid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31254476/

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