我有“ 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))
答案 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