Dear R community, I am working with huge arrays, so I spend a lot of time computing. This is my code: for (x in 1:dim(variable)[1]){ for (y in 1:dim(variable)[2]){ for (z in 1:dim(variable)[3]){ result <- max(variable[x,y,z,]) } } } Is there a more efficient procedure to do this task? Thanks in advance! [[alternative HTML version deleted]]
Hi r-help-bounces at r-project.org napsal dne 21.10.2010 10:40:40:> Dear R community, > > I am working with huge arrays, so I spend a lot of time computing. Thisis> my code: > > for (x in 1:dim(variable)[1]){ > for (y in 1:dim(variable)[2]){ > for (z in 1:dim(variable)[3]){ > result <- max(variable[x,y,z,]) > } > } > } > > Is there a more efficient procedure to do this task?is this what you are looking for? ar<-array(rnorm(24),c(4,3,2)) apply(ar, 3, max) Regards Petr> > Thanks in advance! > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guidehttp://www.R-project.org/posting-guide.html> and provide commented, minimal, self-contained, reproducible code.
Hi fjsanala at gmail.com napsal dne 21.10.2010 12:44:30:> Hi Petr, thanks for your help. > > My array has four dimensions. My problem is the next: > > library(survival) > initial <- array(rnorm(1200000),c(40,30,20,50)) > final <- array(0,dim=c(dim(initial)[1],dim(initial)[2],dim(initial)[3]))> for (i in 1:dim(initial)[1]){ > for (j in 1:dim(initial)[2]){ > for (k in 1:dim(initial)[3]){ > final[i,j,k] <- function(initial[i,j,k,]) > } > } > } > > My own function has a high computational cost, so Can I use the applyfunction? Well it strongly depends what and how function "function" computes its result. Basically you can use apply for computing a result over margin of array> ar<-array(1:120, c(5,4,3,2)) > apply(ar, 4, sum)[1] 1830 5430> apply(ar, 3, sum)[1] 1620 2420 3220> apply(ar, 2, sum)[1] 1590 1740 1890 2040> apply(ar, 1, sum)[1] 1404 1428 1452 1476 1500> apply(ar, 4, range)[,1] [,2] [1,] 1 61 [2,] 60 120 Regards Petr> > Thank you! > >> 2010/10/21 Petr PIKAL <petr.pikal at precheza.cz> > Hi > > r-help-bounces at r-project.org napsal dne 21.10.2010 10:40:40: > > > Dear R community, > > > > I am working with huge arrays, so I spend a lot of time computing.This> is > > my code: > > > > for (x in 1:dim(variable)[1]){ > > for (y in 1:dim(variable)[2]){ > > for (z in 1:dim(variable)[3]){ > > result <- max(variable[x,y,z,]) > > } > > } > > } > > > > Is there a more efficient procedure to do this task?> is this what you are looking for? > > ar<-array(rnorm(24),c(4,3,2)) > apply(ar, 3, max) > > Regards > Petr > > > > > > Thanks in advance! > > > > [[alternative HTML version deleted]] > > > > ______________________________________________ > > R-help at r-project.org mailing list > > https://stat.ethz.ch/mailman/listinfo/r-help > > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > > and provide commented, minimal, self-contained, reproducible code.
On Oct 21, 2010, at 4:40 AM, Francisco Javier Santos Alamillos wrote:> Dear R community, > > I am working with huge arrays, so I spend a lot of time computing. > This is > my code: > > for (x in 1:dim(variable)[1]){ > for (y in 1:dim(variable)[2]){ > for (z in 1:dim(variable)[3]){ > result <- max(variable[x,y,z,]) > } > } > } > > Is there a more efficient procedure to do this task?Are you sure this is a proper specification of the "task"?. You have overwritten the "result" with max(.) multiple times (the product of the dimensions) and only have at the end that effort just the max of the last slice of the variable.> > Thanks in advance!-- David Winsemius, MD West Hartford, CT
On Oct 21, 2010, at 8:39 AM, Petr PIKAL wrote:> Hi > > fjsanala at gmail.com napsal dne 21.10.2010 12:44:30: > >> Hi Petr, thanks for your help. >> >> My array has four dimensions. My problem is the next: >> >> library(survival) >> initial <- array(rnorm(1200000),c(40,30,20,50)) >> final <- array(0, > dim=c(dim(initial)[1],dim(initial)[2],dim(initial)[3])) >> for (i in 1:dim(initial)[1]){ >> for (j in 1:dim(initial)[2]){ >> for (k in 1:dim(initial)[3]){ >> final[i,j,k] <- function(initial[i,j,k,]) >> } >> } >> } >> >> My own function has a high computational cost, so Can I use the apply > function?You can, of course do so, but it may not yield improvements.> > Well it strongly depends what and how function "function" computes its > result.> Basically you can use apply for computing a result over margin of > array > >> ar<-array(1:120, c(5,4,3,2)) >> apply(ar, 4, sum) > [1] 1830 5430 >> apply(ar, 3, sum) > [1] 1620 2420 3220 >> apply(ar, 2, sum) > [1] 1590 1740 1890 2040 >> apply(ar, 1, sum) > [1] 1404 1428 1452 1476 1500 > >> apply(ar, 4, range) > [,1] [,2] > [1,] 1 61 > [2,] 60 120 >I think that is not correct: > initial <- array(rnorm(120),c(4,3,2,5)) > final1 <- array(0, dim=c(dim(initial)[1],dim(initial) [2],dim(initial)[3])) > for (i in 1:dim(initial)[1]){ + for (j in 1:dim(initial)[2]){ + for (k in 1:dim(initial)[3]){ + final1[i,j,k] <- max(initial[i,j,k,]) + } + } + } > final2 <- array(0, dim=c(dim(initial)[1],dim(initial) [2],dim(initial)[3])) > final2 <- apply(initial, 1:3, max) > # the proper indexing for apply is 1:3 rather than 4 > identical(final2, final1) [1] TRUE > final3 <- apply(initial, 4, max) > identical(final3, final1) [1] FALSE -- David.> Regards > Petr > >> >> Thank you! >> >> > >> 2010/10/21 Petr PIKAL <petr.pikal at precheza.cz> >> Hi >> >> r-help-bounces at r-project.org napsal dne 21.10.2010 10:40:40: >> >>> Dear R community, >>> >>> I am working with huge arrays, so I spend a lot of time computing. > This >> is >>> my code: >>> >>> for (x in 1:dim(variable)[1]){ >>> for (y in 1:dim(variable)[2]){ >>> for (z in 1:dim(variable)[3]){ >>> result <- max(variable[x,y,z,]) >>> } >>> } >>> } >>> >>> Is there a more efficient procedure to do this task? > >> is this what you are looking for? >> >> ar<-array(rnorm(24),c(4,3,2)) >> apply(ar, 3, max) >> >> Regards >> Petr >> >> >>> >>> Thanks in advance! >>> >>> [[alternative HTML version deleted]] >>> >>> ______________________________________________ >>> R-help at r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-help >>> PLEASE do read the posting guide >> http://www.R-project.org/posting-guide.html >>> and provide commented, minimal, self-contained, reproducible code. > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.David Winsemius, MD West Hartford, CT