в выборке R список вероятностей возвращает одну позицию. Как преобразовать эту позицию в индекс элемента?

У меня есть матрица 3x3x3 (MP) нормализованных вероятностей (сумма до 1). Когда я запускаю пример (27,1, MP, replace = T), он возвращает целое число от 1 до 27, предположительно, последовательный индекс матрицы. Я хотел бы знать, какой элемент матрицы с точки зрения индексов элементов (например, номер строки, номер столбца, номер z). Как при построении массива из N измерений (в данном случае N=3) определить порядок элементов? Другими словами, если я взял N-мерный массив и поместил все элементы в список, как я могу сопоставить список с N-мерными элементами?


person Joseph Kreke    schedule 16.07.2013    source источник


Ответы (2)


Используйте which с аргументом arr.ind=TRUE, чтобы вернуть индексы массива.

 m <- array((1:27)*10, dim=c(3,3,3))

 x <- sample(27, 1)
 x
 # [1] 20

 which(m == m[x], arr.ind=TRUE)
 #      dim1 dim2 dim3
 # [1,]    2    1    3
person Hong Ooi    schedule 16.07.2013
comment
Превосходно. Как раз то, что я искал. Этот ответ в сочетании со вторым ответом, который я получил, предоставит мне нужное мне решение. Благодарю вас! - person Joseph Kreke; 16.07.2013

Технически это матрица, только если она двумерная. У вас есть трехмерный массив. Если вы просто попробуете:

array( 1:27, dim = c(3, 3, 3) )

, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]   10   13   16
[2,]   11   14   17
[3,]   12   15   18

, , 3

     [,1] [,2] [,3]
[1,]   19   22   25
[2,]   20   23   26
[3,]   21   24   27

Таким образом, вы можете видеть из распечатки, какой индекс соответствует какому последовательному значению. Например, элемент 20 в последовательности 1:27 находится в [2, 1, 3]. Последовательность подсчитывается сначала по столбцам, затем по строкам, затем по матрицам. Зная это, вам не нужно так сильно беспокоиться о сохранении индексов. Вы всегда можете воссоздать свой массив. Кроме того, если вы просто хотите попробовать свой предмет, вы можете сделать следующее:

y <- array( 1:27, dim = c(3, 3, 3) ) / sum(1:27) # an array like yours
sample(y, 1)

Или, если вы хотите просто зашифровать весь массив, вы можете попробовать sample(y).

Кстати, если вы действительно хотите делать то, что, кажется, указываете, при запуске примера используйте sample.int. Он имеет более высокую производительность.

person John    schedule 16.07.2013
comment
Большой. Спасибо. Очень полезно. - person Joseph Kreke; 16.07.2013