array_reshape () не изменяет массив по желанию - PullRequest
1 голос
/ 01 апреля 2019

У меня есть "old_array", я хочу изменить его, чтобы он стал "new_array", используя array_reshape ()

old_array <- array(seq(1,30,1),c(2,3,5))
new_array <- t(array(seq(1,30,1),c(6,5)))

old_array:

, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

, , 3

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

, , 4

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

, , 5

     [,1] [,2] [,3]
[1,]   25   27   29
[2,]   26   28   30

New_array:

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3    4    5    6
[2,]    7    8    9   10   11   12
[3,]   13   14   15   16   17   18
[4,]   19   20   21   22   23   24
[5,]   25   26   27   28   29   30

Я попробовал следующий код, однако измененный массив не так, как я хочу:

array_reshape(old_array,c(6,5))

Ожидаемые результаты:

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3    4    5    6
[2,]    7    8    9   10   11   12
[3,]   13   14   15   16   17   18
[4,]   19   20   21   22   23   24
[5,]   25   26   27   28   29   30

Фактические результаты:

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    7   13   19   25
[2,]    3    9   15   21   27
[3,]    5   11   17   23   29
[4,]    2    8   14   20   26
[5,]    4   10   16   22   28
[6,]    6   12   18   24   30

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Сначала вы хотите матрицу 5х6. Ваш текущий код запрашивает возврат 6x5, поэтому вы хотите написать

array_reshape(old_array, c(5,6))

Однако ваш old_array возвращает 5 разных матриц все 2x3. Поскольку вы заполняете его по строкам, похоже, что array_reshape будет принимать первое значение из каждой строки каждой отдельной матрицы, а затем, если вы укажете, что у него 6 столбцов, оно затем захватывает второе значение первой матрицы, чтобы заполнить первый ряд 5х6. Затем он повторяет этот шаблон, чтобы заполнить остальные 4 строки. Это вернет:

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    7   13   19   25    3
[2,]    9   15   21   27    5   11
[3,]   17   23   29    2    8   14
[4,]   20   26    4   10   16   22
[5,]   28    6   12   18   24   30   

Можете ли вы удалить c (2,3,5) из вашей строки old_array? Это будет хорошо работать тогда. В противном случае array_reshape не является подходящей функцией в этом случае. Но, если вы действительно хотите использовать его, вы можете указать ему заполнить матрицу 6x5 столбцом, а затем транспонировать матрицу. Это даст вам желаемый результат:

t(array_reshape(old_array, c(6,5), "F"))

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3    4    5    6
[2,]    7    8    9   10   11   12
[3,]   13   14   15   16   17   18
[4,]   19   20   21   22   23   24
[5,]   25   26   27   28   29   30
1 голос
/ 01 апреля 2019

Вы можете позвонить matrix и указать желаемые размеры.Учитывая, как R заполняет матрицы, вам нужно указать byrow = TRUE в этом сценарии:

old_array <- array(seq(1,30,1),c(2,3,5))
matrix(old_array, nrow = dim(old_array)[3], ncol = prod(dim(old_array)[1:2]), byrow = TRUE)
#>      [,1] [,2] [,3] [,4] [,5] [,6]
#> [1,]    1    2    3    4    5    6
#> [2,]    7    8    9   10   11   12
#> [3,]   13   14   15   16   17   18
#> [4,]   19   20   21   22   23   24
#> [5,]   25   26   27   28   29   30

Создано в 2019-03-31 пакетом Представить (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...