array_reshape()不根据需要重塑数组

时间:2019-04-01 00:40:01

标签: r

我有“ old_array”,我想使用array_reshape()将其重塑为“ new_array”

a string

old_array是:

type MyStruct struct {
    Debug   bool
    AString bool
    SomethingMoreComplex
}

var myStruct MyStruct

func GetField(s string) reflect.Value {
   v := reflect.ValueOf(myStruct)
   return v.FieldByName(s)
}

function main() {
    GetField("debug")
    GetField("a.string")
    GetField("a-string")
    GetField("a_string")
    GetField("-a.string")
    GetField("something-more-complex")
}

new_array是:

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

我尝试了以下代码,但是重塑数组并不是我想要的方式:

, , 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

预期结果:

     [,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))

2 个答案:

答案 0 :(得分:1)

您可以致电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

reprex package(v0.2.1)于2019-03-31创建

答案 1 :(得分:1)

首先,您需要一个5x6的矩阵。您当前的代码要求返回6x5,所以您要编写

array_reshape(old_array, c(5,6))

但是,您的old_array返回的是2x3的5个不同的矩阵。由于您是按行填充它,因此好像array_reshape将从每个单独的矩阵的每一行中获取第一个值,然后由于您告诉它具有6列,因此它将获取第一个矩阵的第二个值来填充5x6的第一行。然后,它重复此模式以填充其他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   

可以从old_array行中删除c(2,3,5)吗?它将正常工作。否则,在这种情况下,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