Convertir una matriz en una matriz unidimensional


110

Tengo una matriz (32X48).

¿Cómo puedo convertir la matriz en una matriz unidimensional?

Respuestas:


214

Léalo con 'scan', o simplemente haga como.vector () en la matriz. Es posible que desee transponer la matriz primero si lo desea por filas o columnas.

> m=matrix(1:12,3,4)
> m
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> as.vector(m)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12
> as.vector(t(m))
 [1]  1  4  7 10  2  5  8 11  3  6  9 12

32

tratar c()

x = matrix(1:9, ncol = 3)

x
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

c(x)

[1] 1 2 3 4 5 6 7 8 9

Eso es un vector, no una matriz 1-d.
hadley

hmm. Es verdad. Quizás no sea una matriz 1-d, sino un vector 1-d.
Greg

30

Si estamos hablando de data.frame, entonces debería preguntarse si las variables son del mismo tipo. Si ese es el caso, puede usar rapply o unlist, ya que data.frames son listas, en el fondo de sus almas ...

 data(mtcars)
 unlist(mtcars)
 rapply(mtcars, c) # completely stupid and pointless, and slower

14

array(A)o array(t(A))le dará una matriz 1-d.


12

De ?matrix: "Una matriz es el caso especial de una 'matriz' bidimensional". Simplemente puede cambiar las dimensiones de la matriz / matriz.

Elts_int <- as.matrix(tmp_int)  # read.table returns a data.frame as Brandon noted
dim(Elts_int) <- (maxrow_int*maxcol_int,1)

1
La tabla de lectura devuelve un marco de datos, no una matriz. ¿Seguirá funcionando sin as.matrix ()?
Brandon Bertelsen

6

Puede que sea muy tarde, de todos modos, esta es mi forma de convertir Matrix en vector:

library(gdata)
vector_data<- unmatrix(yourdata,byrow=T))

espero que ayude


4

puede utilizar as.vector(). Parece que es el método más rápido según mi pequeño punto de referencia, de la siguiente manera:

library(microbenchmark)
x=matrix(runif(1e4),100,100) # generate a 100x100 matrix
microbenchmark(y<-as.vector(x),y<-x[1:length(x)],y<-array(x),y<-c(x),times=1e4)

La primera solución usa as.vector(), la segunda usa el hecho de que una matriz se almacena como una matriz contigua en la memoria y length(m)da el número de elementos en una matriz m. El tercero instancia un arrayfrom x, y el cuarto usa la función concatenar c(). También probé unmatrixa partir gdata, pero es demasiado lento para ser mencionados aquí.

Estos son algunos de los resultados numéricos que obtuve:

> microbenchmark(
        y<-as.vector(x),
        y<-x[1:length(x)],
        y<-array(x),
        y<-c(x),
        times=1e4)

Unit: microseconds
                expr    min      lq     mean  median      uq       max neval
   y <- as.vector(x)  8.251 13.1640 29.02656 14.4865 15.7900 69933.707 10000
 y <- x[1:length(x)] 59.709 70.8865 97.45981 73.5775 77.0910 75042.933 10000
       y <- array(x)  9.940 15.8895 26.24500 17.2330 18.4705  2106.090 10000
           y <- c(x) 22.406 33.8815 47.74805 40.7300 45.5955  1622.115 10000

Aplanar una matriz es una operación común en Machine Learning, donde una matriz puede representar los parámetros a aprender, pero se usa un algoritmo de optimización de una biblioteca genérica que espera un vector de parámetros. Entonces, es común transformar la matriz (o matrices) en dicho vector. Es el caso de la función R estándar optim().


1

Puedes usar la solución de Joshua pero creo que necesitas Elts_int <- as.matrix(tmp_int)

O para bucles:

z <- 1 ## Initialize
counter <- 1 ## Initialize
for(y in 1:48) { ## Assuming 48 columns otherwise, swap 48 and 32
for (x in 1:32) {  
z[counter] <- tmp_int[x,y]
counter <- 1 + counter
}
}

z es un vector 1d.


1

Simple y rápido ya que una matriz 1d es esencialmente un vector

vector <- array[1:length(array)]

1

Si, en cambio, tenía un data.frame (df) que tenía varias columnas y desea vectorizar, puede hacerlo

como.matriz (gl, ncol = 1)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.