2016-10-13 2 views
2

У меня есть простой вопрос, который, кажется, не способен обернуть мою голову. У меня есть 3D-массив (стек изображений), и я пытаюсь сделать проекцию на 2D-массив (например, максимальная проекция интенсивности для стека изображений). Для этого у меня есть матрица индексов, которая указывает на использование z-стека для каждого пикселя.Выбор записей массива на основе значений 2D-матрицы

К примеру, у меня есть 3D-массив, который выглядит следующим образом:

, , 1 

    [,1] [,2] 
[1,] 1 3 
[2,] 2 4 

, , 2 

    [,1] [,2] 
[1,] 5 7 
[2,] 6 8 

И в «матрице выбора», который выглядит следующим образом:

 [,1] [,2] 
[1,] 1 1 
[2,] 2 2 

Результат этого выбора должен затем быть

 [,1] [,2] 
[1,] 1 3 
[2,] 6 8 

ie означает, что матрица указывает, из каких «z-столбцов» массива извлекается значение s.

Я знаю, что это должна быть глупая простая вещь, но я рисую пробел о том, как это сделать. Заранее спасибо!

+0

Это работает 't (sapply (1: nrow (m), function (i) ar [,, i] [cbind (m [i,], 1: 2)]))' (предполагая 'ar' ваш массив и 'm' является матрицей выбора) –

ответ

1

Один из способов сделать это состоит в использовании многомерную индексацию массива через cbind:

вот ваши данные и выбор матрицы:

d <- array(1:8,c(2,2,2)) 
selec <- matrix(c(1,2,1,2),2,2) 

Сначала построим сетку ваших индексов матрицы выбора:

selec.ind <- expand.grid(1:nrow(selec),1:ncol(selec)) 

Затем использовать это со значениями матрицы выбора для доступа d:

out <- matrix(d[cbind(selec.ind$Var1,selec.ind$Var2,as.vector(selec))], nrow(selec), ncol(selec)) 
##  [,1] [,2] 
##[1,] 1 3 
##[2,] 6 8 

Наконец, изменить результат обратно в размер матрицы выбора.

Это будет работать с любой матрицей выбора размера и любым количеством слоев в z.

0

Это работает только для массива 2 третьих размеров (dim=c(...,...,2)) данных:

ar=array(data=c(1,2,3,4,5,6,7,8),dim = c(2,2,2)) 
, , 1 

    [,1] [,2] 
[1,] 1 3 
[2,] 2 4 

, , 2 

    [,1] [,2] 
[1,] 5 7 
[2,] 6 8 
selec=matrix(c(1,2,1,2),nrow = 2,ncol = 2) 
    [,1] [,2] 
[1,] 1 1 
[2,] 2 2 

Мы используем ifelse

ifelse(selec==1,ar[,,1],ar[,,2]) 
    [,1] [,2] 
[1,] 1 3 
[2,] 6 8 
+0

Хорошая идея, но, к сожалению, у меня более 2 слоев в третьем измерении (11, если быть точным) –

Смежные вопросы