2016-03-04 25 views
0

三維數組我有3D陣列的列表,看起來像這樣:分隔第3個模糊中的矩陣。 R中

my.arrs <- list(array(1:5, c(5,4,2)),array(1:5, c(5,4,2)),array(1:5, c(5,4,2))); 
my.arrs 

我想擁有的是分開的(理想情況下,應該包含在我的數組列表中的新列表,每個矩陣看起來像這樣):

my.new.matrices (list of 6) 
my.array[[1]][1] 
my.array[[1]][2] 
my.array[[2]][1] 
my.array[[2]][2] 
my.array[[3]][1] 
my.array[[3]][2] 

在我遇到這個問題之前,我的工作非常相似。我有這個作爲模擬的結果,我R中運行:

> TBM 
    , , 1 

       [,1]   [,2]  [,3]  [,4]   [,5]   [,6]   [,7]   
    [1,] 0.05151012 0.345498935 0.26056614 0.04567956 0.073153163 -0.070264403 0.158124924 

, , 2 

      [,1]  [,2]   [,3]  [,4]  [,5]  [,6]  [,7]   
[1,] -0.65883235 -0.43591955 -0.116739746 -0.28835563 0.04351086 -0.03692388 0.60592379 

, , 3 

      [,1]  [,2]  [,3]  [,4]  [,5]   [,6]  [,7]  
[1,] 0.2816988 0.3726166 0.4434252 0.4204302 0.2684518 0.454951339 0.64363895 

而我寫這篇for()循環:

TBM.vector3 <- list() 
for(i in 1:dim(TBM)[3]) { 
    print(i) 
    TBM.vector3[[i]] <- as.vector(TBM[,,i]) 
} 
TBM.vector3 

使自己想買什麼,即在每個矩陣分離第三維並將它們存儲在矢量列表中。我想將這個過程自動化爲一個像my.arrs這樣的數組列表。

回答

0

如果我明白你問什麼,這裏有一個方法:

unlist(lapply(my.arrs, function(x) { 
    lapply(1:dim(x)[3], function(y) { 
     x[,,y] 
    }) 
}), recursive = FALSE) 
#[[1]] 
#  [,1] [,2] [,3] [,4] 
#[1,] 1 1 1 1 
#[2,] 2 2 2 2 
#[3,] 3 3 3 3 
#[4,] 4 4 4 4 
#[5,] 5 5 5 5 
## ... 
## ... 
#[[6]] 
#  [,1] [,2] [,3] [,4] 
#[1,] 11 11 11 11 
#[2,] 12 12 12 12 
#[3,] 13 13 13 13 
#[4,] 14 14 14 14 
#[5,] 15 15 15 15 

  • lapply遍歷每個陣列
  • lapply遍歷每個切片(第三維),因此2未被硬編碼爲功能
  • 調用unlistrecursive = FALSE(它是而不是的默認行爲)將長度爲2的列表長度爲3的lapply(lapply(...))結果擴展爲單個長度爲6的列表。

數據:

my.arrs <- list(
    array(1:5, c(5,4,2)), 
    array(6:10, c(5,4,2)), 
    array(11:15, c(5,4,2)) 
) 
+1

你好@nrussel,反覆嘗試我的循環後,我嘗試了你的建議,並在for循環中應用。它以我想要的方式工作!非常感謝你! –

1

1)tapply每3個陣列是由2個5×4矩陣,以便創建一個長向量出來的這一切,然後抓住連續矢量的5 * 4組分並將它們變成所需形狀的矩陣:

tapply(unlist(my.arrs), gl(3*2, 5*4), matrix, 5) 

或者更一般地:

dims <- dim(my.arrs[[1]]) # c(5, 4, 2) 
tapply(unlist(my.arrs), gl(length(my.arrs) * dims[3], prod(dims[1:2])), matrix, dims[1]) 

2)sapply/lapply另一種可能性(其中dims如上文所定義):

c(sapply(my.arrs, function(x) lapply(1:dims[3], function(i) x[,,i]))) 
0

謝謝@G。格洛騰迪克和@nrussell爲你的答案,

我也在努力我的同時,與unlist()有同樣的結果,並發現我的實際問題是什麼。

我爲n <- 2運行仿真的輸出,使這種格式的列表(後來我想,使其運行於一個更大的數據集和變現的100,所以讓我們從小事做起):

TBM List of 3 
tbm1: num [1:29, 1:28, 1:2] ... 
tbm2: num [1:29, 1:28, 1:2] ... 
tbm3: num [1:29, 1:28, 1:2] ... 

...是我的輸出數據。

因爲我將有一個大型的數據集和n < - 100,我不能手動取消列表。因此,我寫了這個:

TBM.n <- rep(list(matrix(nrow=29, ncol=28)),6) 

for(j in 1:length(TBM)){ 

for(jj in 1:dim(TBM[[i]])[3]){ 
    print(jj) 

    print(unlist(TBM[[j]][,,jj])) 
    TBM.n[[j]] <- unlist(TBM[[j]][,,jj]) 
    } 

} 

print(jj)給出:

1 
2 
1 
2 
1 
2 

print(unlist(TBM[[j]][,,jj]))給我的數據拆分,因爲我想要的。 這裏來了我的實際問題,存儲。當我寫:

TBM.n[[j]] <- unlist(TBM[[j]][,,jj]) 

TBM.n[[jj]] <- unlist(TBM[[j]][,,jj]) 

我保存tbm1[,,2]tbm2[,,2]tbm3[,,2]tbm2[,,2]tbm3[,,2] repectively數據。 直到現在我還沒有找到存儲整個6矩陣的解決方案。我感覺這是一個索引問題,仍在嘗試,而不是解決。 你有什麼建議嗎?

謝謝馬里昂^ h


編輯 這是我最後的代碼我改編自@nrussel:

TBM.n <- list() 
for (i3 in 1){ #in length(TBM) 
    TBM.n[[i3]] <- unlist(lapply(TBM, function(x){ 
    lapply(1:dim(x)[3], function(y){ 
     x[,,y] 
    }) 
    }), recursive = FALSE 
) 
} 

輸出給了我所期望的結果:

TBM.n List of 1 
    :List of 6 
    ..$ tbm11: num[1:29, 1:28] ... 
    ..$ tbm12: num[1:29, 1:28] ... 
    ..$ tbm21: num[1:29, 1:28] ... 
    ..$ tbm22: num[1:29, 1:28] ... 
    ..$ tbm31: num[1:29, 1:28] ... 
    ..$ tbm32: num[1:29, 1:28] ... 

再次感謝您的幫助!