R 迭代多维数组的索引

标签 r

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

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

现在,有了 dims vector 我想通过数组的所有索引进行迭代,例如,有
dims <- c(2,3)

我希望能够获得一系列向量:
c(1,1)
c(1,2)
c(1,3)
c(2,1)
c(2,2)
c(2,3)

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

我能想到的只有三种方法:
  • 迭代 1:length(arr)并将这些数字转换为
    索引向量 - 在上面的例子中,我会寻找一个(最好是内置的)函数做 indexesOf(arr, 4) -> c(2,1) .
  • 获取最后生成的索引向量,在最后一个位置增加元素,并确保它在 dims 给定的范围内.
  • 生成一个矩阵,其中的列将包含我需要的所有索引。

  • 但是,遗憾的是,前两种方法都不是快速或优雅的。第三个看起来是个不错的主意,我可以在纸上完成,但我无法使用 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
    }
    

    最佳答案

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

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

    似乎做 #3 ...

    关于R 迭代多维数组的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10870392/

    相关文章:

    r - 计算某个值已出现次数的函数/指令

    r - 有没有一种整洁的方法来改变小标题中的单个细胞?

    r - glm.nb 与 sqrt 链接

    r - 使用@timestamp将数据帧写入Elastic Search

    r - 对内部使用 grepl 的 vapply 函数感到困惑(datacamp 类(class)的一部分)

    r - 计算一列与选择的其他列之间的相关性,无需循环

    将特定列中的 NA 替换为同一列中相等键的值

    list - 合并两个列表组件

    regex - 逻辑测试字符串是否恰好是 2 个或更多空格

    r - Shiny(R GUI)用标记中的<和>替换<和>