2013-05-23 9 views
5

से उप मैट्रिक्स का अनुक्रम का चयन करें ए एक 100 आयामी सरणी है जिसमें मंद 100 * 100 * 100 * 100 है। मैं ए के पिछले दो आयामों से 10000 उप मैट्रिक्स का चयन करना चाहता हूं। बी और सी लंबाई 10000 के वैक्टर हैं। वे चयन मानदंड हैं। बी ए की पंक्ति संख्या निर्दिष्ट करता है, और सी कॉलम संख्या निर्दिष्ट करता है।आर, उच्च आयामी सरणी

A <- array(rnorm(100^4), dim=c(100,100,100,100)) 
B <- sample(nrow(A) , 10000 , repl = TRUE) 
C <- sample(ncol(A) , 10000 , repl = TRUE) 
D <- array(0, dim=c(10000,100,100)) 
पाश के लिए के साथ

:

system.time(
for (i in 1:10000){  
    D[i,,] <- A[B[i],C[i],,] 
}) 

user system elapsed 
10.20 0.14 10.34 

mapply साथ:

sub_array <- function(b,c) return(A[b,c,,]) 
system.time(D <- mapply(FUN = sub_array, B, C, SIMPLIFY='array')) 

user system elapsed 
9.77 3.75 29.17 

जो भी धीमी है। क्या ऐसा करने का कोई तेज तरीका है? धन्यवाद।

उत्तर

2

चाल 312 सरणी में A को फिर से मंद करना है ताकि आप "सामान्य" अनुक्रमण को कॉल करने के लिए उपयोग कर सकें।

कुछ नमूना डेटा:

n <- 60 
A <- array(rnorm(n^4), dim=c(n,n,n,n)) 
B <- sample(nrow(A) , n^2 , repl = TRUE) 
C <- sample(ncol(A) , n^2 , repl = TRUE) 
D <- array(0, dim=c(n^2,n,n)) 

ओपी की विधि:

system.time({ 
    D <- array(0, dim=c(n*n, n, n)) 
    for (i in 1:(n*n)) D[i,,] <- A[B[i],C[i],,] 
}) 
# user system elapsed 
# 2.33 0.08 2.41 

अनुशंसित समाधान:

system.time({ 
    d <- dim(A) 
    dim(A) <- c(prod(d[1:2]), d[3:4]) 
    D2 <- A[B + d[1]*(C-1),,] 
}) 
# user system elapsed 
# 0.37 0.06 0.44 

और हम जाँच करें कि परिणाम समान हैं:

identical(D, D2) 
# [1] TRUE 
संबंधित मुद्दे