Использование 2D-массива в качестве индекса для 3D-массива - PullRequest
0 голосов
/ 04 июня 2018

У меня есть трехмерный массив в R, например,

a <- array(1:24, dim=c(2,3,4))

Я буду ссылаться на размеры этого массива как строки, столбцы и слои.У меня есть вторая переменная, b , которая предназначена для предоставления индекса для этого массива, например,

b <- array(c(1,4,3,2,2,1), dim=c(2,3))

. Я хотел бы получить двумерную переменную, d., который содержит значение из трехмерной переменной a в слое, заданном b для каждой строки и столбца в a и b ,Так, например, d[1, 1] <- a[1, 1 , b[1, 1]] и d[2, 3] <- a[2, 3, b[2, 3]] и так далее.В этом примере я должен получить:

 d == array(c(1, 20, 15, 10, 11, 6), dim=c(2, 3))

Какой самый эффективный способ сделать это?

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Я бы предложил также использовать expand.grid, но я бы сгенерировал индексную матрицу для одновременного адресации каждой записи a.

ind <- as.matrix(expand.grid(1:nrow(b), 1:ncol(b)))
d <- matrix(a[cbind(ind, b[ind])], ncol = ncol(b), nrow = nrow(b))

Я думаю, что это слегка эффективнее

0 голосов
/ 04 июня 2018

Самый быстрый способ сделать это:

structure(a[cbind(c(row(b)),c(col(b)),c(b))],.Dim=dim(b))
     [,1] [,2] [,3]
[1,]    1   15   11
[2,]   20   10    6
0 голосов
/ 04 июня 2018

Мы можем использовать expand.grid, чтобы получить все комбинации строк и столбцов в b, а затем использовать mapply, чтобы получить соответствующий вывод из a, используя индексацию.Мы используем relist, чтобы сделать матрицу d такой же, как b.

df <- expand.grid(row = 1:nrow(b), col = 1:ncol(b))
d <- relist(mapply(function(x, y) a[x, y, b[x, y]], df$row, df$col), b)
d

#     [,1] [,2] [,3]
#[1,]    1   15   11
#[2,]   20   10    6

, где df равно

   row col
#1   1   1
#2   2   1
#3   1   2
#4   2   2
#5   1   3
#6   2   3
...