Hi,

Bill was faster than me in suggesting aperm() instead of apply(), however, his solution is still suboptimal. Try to avoid array(), and
set the dimensions directly if possible.

----

fn1 <- function(x) {
    apply(x, 3, t)
}


fn2 <- function(x) {
    array(aperm(x, c(2, 1, 3)), c(prod(dim(x)[1:2]), dim(x)[3]))
}

fn3 <- function(x) {
    x <- aperm(x, c(2, 1, 3))
    dim(x) <- c(prod(dim(x)[1:2]), dim(x)[3])
    x
}

# check that the functions return the same
x <- array(1:18, dim=c(3, 2, 3))
stopifnot(identical(fn1(x), fn2(x)))
stopifnot(identical(fn1(x), fn3(x)))

# create two larger arrays, play with the size of the 3rd dimension
x <- array(1:18e4, dim=c(3, 2e1, 3e3))
y <- array(1:18e4, dim=c(3e3, 2e1, 3))

# and the timing:
library(microbenchmark)
microbenchmark(fn1(x), fn2(x), fn3(x), fn1(y), fn2(y), fn3(y), times = 100L)

---

Conclusion:
fn3() is about 3x as fast as fn2(), and fn1() can be extremely inefficient if dim(x)[3] is large.


HTH,
  Denes




On 10/20/2015 08:48 PM, William Dunlap wrote:
Or use aperm() (array index permuation):
   > array(aperm(x, c(2,1,3)), c(6,3))
        [,1] [,2] [,3]
   [1,]    1    7   13
   [2,]    4   10   16
   [3,]    2    8   14
   [4,]    5   11   17
   [5,]    3    9   15
   [6,]    6   12   18

Bill Dunlap
TIBCO Software
wdunlap tibco.com


On Tue, Oct 20, 2015 at 11:31 AM, John Laing <john.la...@gmail.com> wrote:
x <- array(1:18, dim=c(3, 2, 3))
x
, , 1

      [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

, , 2

      [,1] [,2]
[1,]    7   10
[2,]    8   11
[3,]    9   12

, , 3

      [,1] [,2]
[1,]   13   16
[2,]   14   17
[3,]   15   18

apply(x, 3, t)
      [,1] [,2] [,3]
[1,]    1    7   13
[2,]    4   10   16
[3,]    2    8   14
[4,]    5   11   17
[5,]    3    9   15
[6,]    6   12   18


On Tue, Oct 20, 2015 at 12:39 PM, Chunyu Dong <dongchunyu2...@163.com>
wrote:

Hello!


Recently I am trying to transfer a large 3-dimensional array to a matrix.
For example, a array like:
, , 1
      [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
, , 2
      [,1] [,2]
[1,]    7   10
[2,]    8   11
[3,]    9   12
, , 3
      [,1] [,2]
[1,]   13   16
[2,]   14   17
[3,]   15   18


I would like to transfer it to a matrix like:
1        7          13
4        10        16
2        8          14
5        11        17
3        9          15
6        12        18


Could you tell me how to do it in R ? Thank you very much!


Best regards,
Chunyu





         [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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.


         [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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.

Reply via email to