1

假设我有 5D array 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 执行此操作。

4

2 回答 2

3

你可以试试:

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 使用的列优先顺序

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])
于 2016-06-20T10:08:11.333 回答
1

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

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

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

于 2016-06-20T09:56:52.723 回答