2016-06-20 17 views
1

Angenommen, ich habe 5D-Array arr. Um 2D-Matrix mit festen 3., 4. und 5. Indizes zu bekommen, mache ich etwas wie: matr = arr[,,3,2,3]. Angenommen, ich habe eine Liste von Indizes idx = c(3,2,3). Gibt es eine Möglichkeit, das gleiche Ergebnis mit idx zu erhalten? So etwas wie matr = arr[,,idx]? Ich habe versucht, es zu tun wieR - Wie bekomme ich die Matrix von multidimensionalen Array

idx = c(,, 3, 2, 3); 
matr = arr[idx]; 

Aber es ist offensichtlich falsch.

UPD in einem allgemeinen Fall Array kann mehr als 5 dimensional sein. Also muss ich das für Idx jeder Größe tun.

+0

Ist 'idx' immer anzeigt die 3., 4. und 5. Dimension? – nicola

+0

Wenn das Array mehr als 5D ist, dann ist es 3., 4., 5., ..., Nth –

Antwort

3

können Sie versuchen:

do.call("[",c(list(arr,TRUE,TRUE),as.list(idx))) 

Ein Beispiel auf einige Daten:

set.seed(123) 
arraydims<-c(5, 3, 6, 3, 4) 
arr<-array(runif(prod(arraydims)),arraydims) 
idx<-c(2,3,2) 
identical(arr[,,2,3,2],do.call("[",c(list(arr,TRUE,TRUE),as.list(idx)))) 
#[1] TRUE 

Sie auch die von R verwendet column-major order ausnutzen können:

array(arr[sum(c(1,cumprod(dim(arr)))[3:length(dim(arr))]*(idx-1))+ 
      seq_len(prod(dim(arr)[1:2]))],dim(arr)[1:2]) 
1

Ich habe diese ein, aber ich bin auch sicher, dass es sollte etwas mehr ausreichend sein ...

A <- array(1:72, dim=c(2,2,3,2,2)) 
res <- eval(parse(text=paste0("A[,,",paste0(idx,collapse=",")),"]"))) 

Grundsätzlich Ihre Indizierung als String vorzubereiten. Möglichkeit, dort eine Funktion zu erstellen.

+0

Ja, ich habe die Idee. Ich habe über so etwas schon einmal nachgedacht, aber ich bin sehr neu in R, also wusste ich nicht, dass 'eval' in R. Traurig ist, aber ich denke, eval ist der einzige Weg :(UPD: nicola hat eine adäquatere Lösung vorgeschlagen. Aber danke trotzdem. –

Verwandte Themen