R迭代多维数组的索引

时间:2012-06-03 12:41:02

标签: r

我有一个多维数组,在运行时之前它的维数是未知的,例如:

dims <- rep(3, dim_count)
arr <- array(0, dims)

现在,拥有dims向量我想迭代数组的所有索引,例如,有

dims <- c(2,3)

我希望能够得到一系列载体:

c(1,1)
c(1,2)
c(1,3)
c(2,1)
c(2,2)
c(2,3)

或者只是生成前一个函数的函数。

我能想到的唯一三种方式是:

  1. 迭代1:length(arr)并将这些数字转换为 索引向量 - 在上面的例子中,我将寻找一个(最好是内置的)函数indexesOf(arr, 4) -> c(2,1)

  2. 获取最后生成的索引向量,在最后一个位置递增元素,并确保它位于dims给出的范围内。

  3. 生成一个矩阵,其中的列将包含我需要的所有索引。

  4. 但遗憾的是,前两种方法都不是快速或优雅的。第三个看起来像一个体面的想法,我可以在纸上做,但我不能使用rbind在R中编码它,依此类推。

    有没有一种好方法可以做到这一点,最好不要使用嵌套循环?

    仅仅是为了比较,我对#3的丑陋循环实现:

    getAllIndexes = function(dims) {
      dimCount <- length(dims)
      ret <- array(1:dims[1], c(1,dims[1]))
      for(i in 2:length(dims)){
        curdims <- dims[i]
    
        a <- array(rep(ret, curdims), c(nrow(ret), curdims * ncol(ret) ))
        b <- rep(1:curdims, each=ncol(ret))
        ret <- rbind(a, b, deparse.level=0)
      }
      ret
    }
    

1 个答案:

答案 0 :(得分:2)

如果我正确解释您的请求,那么

as.matrix(do.call(expand.grid,lapply(dim(arr),seq)))

似乎做了#3 ......