Converti una matrice in una matrice monodimensionale


110

Ho una matrice (32X48).

Come posso convertire la matrice in un array monodimensionale?

Risposte:


214

O leggilo con 'scan', o fai semplicemente as.vector () sulla matrice. Potresti voler trasporre prima la matrice se lo desideri per righe o colonne.

> 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

provare 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

Questo è un vettore e non un array 1-d.
Hadley,

hmm. È vero. Forse non un array 1-d, ma un vettore 1-d.
Greg

30

Se stiamo parlando di data.frame, allora dovresti chiederti se le variabili sono dello stesso tipo? In questo caso, puoi usare rapply o unlist, poiché data.frames sono elenchi, nel profondo delle loro anime ...

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

14

array(A)o array(t(A))ti darà un array 1-d.


12

Da ?matrix: "Una matrice è il caso speciale di un 'array' bidimensionale." Puoi semplicemente modificare le dimensioni della matrice / matrice.

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 tabella di lettura restituisce un data.frame non una matrice. Funzionerà ancora senza as.matrix ()?
Brandon Bertelsen,

6

Potrebbe essere così tardi, comunque ecco il mio modo di convertire Matrix in vettoriale:

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

spero che possa aiutare


4

puoi usare as.vector(). Sembra che sia il metodo più veloce secondo il mio piccolo benchmark, come segue:

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 prima soluzione utilizza as.vector(), la seconda utilizza il fatto che una matrice è archiviata come un array contiguo in memoria e length(m)fornisce il numero di elementi in una matrice m. Il terzo istanzia un arrayfrom xe il quarto usa la funzione concatenate c(). Ho provato anche unmatrixda gdata, ma è troppo lento per essere menzionato qui.

Ecco alcuni dei risultati numerici che ho ottenuto:

> 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

L'appiattimento di una matrice è un'operazione comune nel Machine Learning, dove una matrice può rappresentare i parametri da apprendere ma si utilizza un algoritmo di ottimizzazione da una libreria generica che prevede un vettore di parametri. Quindi è comune trasformare la matrice (o le matrici) in un tale vettore. È il caso della funzione R standard optim().


1

Puoi usare la soluzione di Joshua ma penso che tu ne abbia bisogno Elts_int <- as.matrix(tmp_int)

O per i loop:

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 è un vettore 1d.


1

Semplice e veloce poiché un array 1d è essenzialmente un vettore

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

1

Se invece avevi un data.frame (df) che aveva più colonne e vuoi vettorializzare puoi farlo

as.matrix (df, ncol = 1)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.