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