簡體   English   中英

R 3d陣列到2d矩陣

[英]R 3d array to 2d matrix

讓我們假設我有一個3d維數組(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])
 }
}

你能建議一種更快更優雅的方式嗎?

謝謝

更改數組的維度:

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

我們可以通過調用matrix並指定尺寸來轉換為matrix

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`。 而且,事實上,代碼可以簡化為

matrix(my_array, 10*5, 12)

並使其緊湊。

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM