R:有效地确定一个数组的哪些切片在第二个数组中出现



我在R中有两个三维数组,并希望确定array2中出现哪些array1切片。

有了一维向量,我可以去

vector1 <- 1:5
vector2 <- 2:4
vector1 %in% vector2

但是对于三维数组,我能想到的最好的是

array1 <- array(rep(1:5, each=4), dim=c(2, 2, 5))
array2 <- array(rep(2:4, each=4), dim=c(2, 2, 3))
apply(array1, 3, function (x) {
any(apply(array2, 3, identical, x))
})

由于我将在中等大小的矩阵上进行数百万次比较,因此这种低效的比较成为速率限制步骤。 是否存在允许更高效实现的功能?

您可以使用duplicated来确定一个数组的哪些切片出现在第二个数组中:

duplicated(array(c(array2, array1), c(dim(array1)[1:2], dim(array1)[3]
+dim(array2)[3])), MARGIN=3)[-seq_len(dim(array2)[3])]
#[1] FALSE  TRUE  TRUE  TRUE FALSE

但这只有在您没有重复的情况下才有效array1.

另一种使用outer的方法将每个矩阵与两个矩阵中的其他矩阵进行比较,因此,我对它在这里的效率不太有信心。

fn <- function(x, y) all(array1[, , x] == array2[, , y])
apply(outer(seq_len(dim(array1)[3]),seq_len(dim(array2)[3]), Vectorize(fn)), 1, any)
#[1] FALSE  TRUE  TRUE  TRUE FALSE

最新更新