Arrays R三维阵列到二维矩阵

Arrays R三维阵列到二维矩阵,arrays,r,matrix,Arrays,R,Matrix,假设我有一个三维维度数组(x,y,z),并希望将数据重组为一个维度矩阵(x*y,z),类似于: my_array <- array(1:600, dim=c(10,5,12)) my_matrix<-data.frame() for (j in 1:5) { for (i in 1:10) { my_matrix <- rbind (my_matrix, my_array[i,j,1:12]) } } my_array我们可以通过调用矩阵并指定维度来转换为矩

假设我有一个三维维度数组(x,y,z),并希望将数据重组为一个维度矩阵(x*y,z),类似于:

my_array <- array(1:600, dim=c(10,5,12))
my_matrix<-data.frame()

for (j in 1:5) {
  for (i in 1:10) {
     my_matrix <- rbind (my_matrix, my_array[i,j,1:12])
 }
}

my_array我们可以通过调用
矩阵
并指定维度来转换为
矩阵

res <- matrix(my_array, prod(dim(my_array)[1:2]), dim(my_array)[3])
all.equal(as.matrix(my_matrix), res, check.attributes=FALSE)
#[1] TRUE
并使其紧凑

nchar("matrix(my_array, 10*5, 12)")
#[1] 26

nchar("dim(my_array) <- c(10 * 5 , 12)")
#[1] 31
nchar(“矩阵(我的数组,10*5,12)”)
#[1] 26

nchar(“dim(my_数组)更改数组的维度:

dim(my_array) <- c(10 * 5 , 12)

dim(my_array)@akrun和@Lars Arne Jordanger的解决方案都能工作并产生相同的结果

这两种解决方案的工作原理是:

(1) 将所有矩阵的第一行连接在一起,并将这些行放在组合矩阵的顶部;然后

(2) 将所有矩阵的第二行连接在一起,并将这些行置于第一行的连接之下,依此类推

下面的例子很好地说明了这个想法:

> threeDimArray <- array( NA, dim=c(3,3,4) )
> dims <- dim( threeDimArray )
> 
> constants <- c(1, 10, 100)
> for( id in 1:length(constants) ){
   const <- constants[id]
   threeDimArray[id,,] <- matrix( (1:prod(dims[2:3]))*const, dims[2], dims[3] )
 }
> threeDimArray[1,,]
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> threeDimArray[2,,]
     [,1] [,2] [,3] [,4]
[1,]   10   40   70  100
[2,]   20   50   80  110
[3,]   30   60   90  120
> threeDimArray[3,,]
     [,1] [,2] [,3] [,4]
[1,]  100  400  700 1000
[2,]  200  500  800 1100
[3,]  300  600  900 1200
> # solution 1:
> twoDimMat <- matrix(threeDimArray, prod(dims[1:2]), dims[3])
> twoDimMat
      [,1] [,2] [,3] [,4]
 [1,]    1    4    7   10
 [2,]   10   40   70  100
 [3,]  100  400  700 1000
 [4,]    2    5    8   11
 [5,]   20   50   80  110
 [6,]  200  500  800 1100
 [7,]    3    6    9   12
 [8,]   30   60   90  120
 [9,]  300  600  900 1200
> 
> # solution 2: 
> threeDArray <- threeDimArray
> dim(threeDArray) <- c(prod( dims[1:2] ), dims[3])
> threeDArray
      [,1] [,2] [,3] [,4]
 [1,]    1    4    7   10
 [2,]   10   40   70  100
 [3,]  100  400  700 1000
 [4,]    2    5    8   11
 [5,]   20   50   80  110
 [6,]  200  500  800 1100
 [7,]    3    6    9   12
 [8,]   30   60   90  120
 [9,]  300  600  900 1200
> 
>三个DIM阵列dims
>的常量(id为1:长度(常量)){
常数threeDimArray[2,,]
[,1] [,2] [,3] [,4]
[1,]   10   40   70  100
[2,]   20   50   80  110
[3,]   30   60   90  120
>三维数组[3,,]
[,1] [,2] [,3] [,4]
[1,]  100  400  700 1000
[2,]  200  500  800 1100
[3,]  300  600  900 1200
>#解决方案1:
>二丁点儿二丁点儿
[,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]   10   40   70  100
[3,]  100  400  700 1000
[4,]    2    5    8   11
[5,]   20   50   80  110
[6,]  200  500  800 1100
[7,]    3    6    9   12
[8,]   30   60   90  120
[9,]  300  600  900 1200
> 
>#解决方案2:
>三达瑞暗淡(三达瑞)三达瑞
[,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]   10   40   70  100
[3,]  100  400  700 1000
[4,]    2    5    8   11
[5,]   20   50   80  110
[6,]  200  500  800 1100
[7,]    3    6    9   12
[8,]   30   60   90  120
[9,]  300  600  900 1200
> 

Hi Lars,这会保持数据的顺序吗?我是指第一个y列的所有z值,然后是第二个y列,依此类推……我希望我能接受这两个答案:这也很好地完成了工作(我投了赞成票)你好,Nemesi。我测试了这个解决方案,它给出了与您最初得到的结果相同的结果。请注意,数组是一个具有维度属性的向量,这就是这个简单解决方案有效的原因。简单而好的解决方案。它适用于两个方向:(I)从2d数组(dims NxKK)到3d数组(dims NxKxK),dim(my_数组)嗨,阿克伦,你能添加一些文字来说明你代码的第二行(all.equal(…))吗?thanks@Nemesi只是检查“MyoMatl”的结果是否等于我得到的结果。这对我也适用,但是必须仔细考虑R的阅读顺序。在我的例子中,我必须应用一个Apple()。要获得正确的数组,请在将其读入2d格式之前
> threeDimArray <- array( NA, dim=c(3,3,4) )
> dims <- dim( threeDimArray )
> 
> constants <- c(1, 10, 100)
> for( id in 1:length(constants) ){
   const <- constants[id]
   threeDimArray[id,,] <- matrix( (1:prod(dims[2:3]))*const, dims[2], dims[3] )
 }
> threeDimArray[1,,]
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> threeDimArray[2,,]
     [,1] [,2] [,3] [,4]
[1,]   10   40   70  100
[2,]   20   50   80  110
[3,]   30   60   90  120
> threeDimArray[3,,]
     [,1] [,2] [,3] [,4]
[1,]  100  400  700 1000
[2,]  200  500  800 1100
[3,]  300  600  900 1200
> # solution 1:
> twoDimMat <- matrix(threeDimArray, prod(dims[1:2]), dims[3])
> twoDimMat
      [,1] [,2] [,3] [,4]
 [1,]    1    4    7   10
 [2,]   10   40   70  100
 [3,]  100  400  700 1000
 [4,]    2    5    8   11
 [5,]   20   50   80  110
 [6,]  200  500  800 1100
 [7,]    3    6    9   12
 [8,]   30   60   90  120
 [9,]  300  600  900 1200
> 
> # solution 2: 
> threeDArray <- threeDimArray
> dim(threeDArray) <- c(prod( dims[1:2] ), dims[3])
> threeDArray
      [,1] [,2] [,3] [,4]
 [1,]    1    4    7   10
 [2,]   10   40   70  100
 [3,]  100  400  700 1000
 [4,]    2    5    8   11
 [5,]   20   50   80  110
 [6,]  200  500  800 1100
 [7,]    3    6    9   12
 [8,]   30   60   90  120
 [9,]  300  600  900 1200
>