首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从三维数组到二维矩阵

从三维数组到二维矩阵
EN

Stack Overflow用户
提问于 2016-06-07 00:26:21
回答 3查看 11K关注 0票数 9

假设我有一个三维维数组(x,y,z),并希望将我的数据重构为维数矩阵(x*y,z),如下所示:

代码语言:javascript
复制
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])
 }
}

你能推荐一种更快更优雅的方式吗?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-07 00:28:26

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

代码语言:javascript
复制
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

注意:这不会改变原来的my_array`。而且,实际上代码可以简化为

代码语言:javascript
复制
matrix(my_array, 10*5, 12)

并使其紧凑。

代码语言:javascript
复制
nchar("matrix(my_array, 10*5, 12)")
#[1] 26

nchar("dim(my_array) <- c(10 * 5 , 12)")
#[1] 31
票数 11
EN

Stack Overflow用户

发布于 2016-06-07 00:32:07

更改数组的维数:

代码语言:javascript
复制
dim(my_array) <- c(10 * 5 , 12)
票数 11
EN

Stack Overflow用户

发布于 2017-02-11 23:45:16

@akrun和@Lars Arne Jordanger的解决方案都有效,并生成相同的结果。

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

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

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

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

代码语言:javascript
复制
> 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
> 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37662433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档