【问题标题】:R - How to get matrix from multidimensional arrayR - 如何从多维数组中获取矩阵
【发布时间】:2016-10-21 12:16:15
【问题描述】:

假设我有 5D 数组 arr。 要获得具有固定第 3、第 4 和第 5 个索引的 2d 矩阵,我执行以下操作:matr = arr[,,3,2,3]。假设我有索引列表idx = c(3,2,3)。有没有办法使用idx 获得相同的结果?像matr = arr[,,idx] 这样的东西?我试过这样做

idx = c(,, 3, 2, 3);
matr = arr[idx];

但这显然是错误的。

UPD 在普通情况下的数组可能超过 5 维。所以我需要为任何大小的 idx 执行此操作。

【问题讨论】:

  • idx 是否总是表示第 3、第 4 和第 5 维?
  • 如果数组大于5D,则为3rd,4th,5th,...,Nth

标签: r multidimensional-array sub-array


【解决方案1】:

你可以试试:

do.call("[",c(list(arr,TRUE,TRUE),as.list(idx)))

一些数据的例子:

set.seed(123)
arraydims<-c(5, 3, 6, 3, 4)
arr<-array(runif(prod(arraydims)),arraydims)
idx<-c(2,3,2)
identical(arr[,,2,3,2],do.call("[",c(list(arr,TRUE,TRUE),as.list(idx))))
#[1] TRUE

你也可以利用R使用的column-major order

array(arr[sum(c(1,cumprod(dim(arr)))[3:length(dim(arr))]*(idx-1))+
            seq_len(prod(dim(arr)[1:2]))],dim(arr)[1:2])

【讨论】:

    【解决方案2】:

    我有这个,但我也确信应该有更合适的东西......

    A <- array(1:72, dim=c(2,2,3,2,2))
    res <- eval(parse(text=paste0("A[,,",paste0(idx,collapse=",")),"]")))
    

    基本上将您的索引准备为字符串。有机会在那里创建一个函数。

    【讨论】:

    • 是的,我明白了。我以前想过这样的事情,但我对 R 很陌生,所以不知道 R 中有 eval。可悲的是,但我认为 eval 是唯一的方法:( UPD:nicola 提出了更充分的解决方案。不过还是谢谢你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    相关资源
    最近更新 更多