Konvertieren Sie eine Matrix in ein eindimensionales Array

110

Ich habe eine Matrix (32X48).

Wie kann ich die Matrix in ein eindimensionales Array konvertieren?

Alos
quelle

Antworten:

214

Lesen Sie es entweder mit 'scan' ein oder machen Sie einfach as.vector () in der Matrix. Möglicherweise möchten Sie die Matrix zuerst transponieren, wenn Sie sie nach Zeilen oder Spalten wünschen.

> 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
Spacedman
quelle
32

Versuchen 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
Greg
quelle
Das ist ein Vektor und kein 1-D-Array.
Hadley
hmm. Das ist richtig. Vielleicht kein 1-d-Array, sondern ein 1-d-Vektor.
Greg
30

Wenn es sich um data.frame handelt, sollten Sie sich fragen, ob die Variablen vom gleichen Typ sind. Wenn dies der Fall ist, können Sie rapply oder unlist verwenden, da data.frames Listen sind, die tief in ihrer Seele liegen ...

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

array(A)oder array(t(A))Sie erhalten ein 1-d-Array.

Tian
quelle
12

Aus ?matrix: "Eine Matrix ist der Spezialfall eines zweidimensionalen 'Arrays'." Sie können einfach die Abmessungen der Matrix / des Arrays ändern.

Elts_int <- as.matrix(tmp_int)  # read.table returns a data.frame as Brandon noted
dim(Elts_int) <- (maxrow_int*maxcol_int,1)
Joshua Ulrich
quelle
1
Die Lesetabelle gibt einen data.frame zurück, keine Matrix. Funktioniert das auch ohne as.matrix ()?
Brandon Bertelsen
6

Es könnte sowieso so spät sein, hier ist meine Art, Matrix in Vektor umzuwandeln:

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

hoffe das wird helfen

hema
quelle
4

Sie können verwenden as.vector(). Es sieht so aus, als wäre es nach meinem kleinen Benchmark die schnellste Methode:

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)

Die erste Lösung verwendet as.vector(), die zweite verwendet die Tatsache, dass eine Matrix als zusammenhängendes Array im Speicher gespeichert ist und length(m)gibt die Anzahl der Elemente in einer Matrix an m. Der dritte instanziiert ein arrayfrom xund der vierte verwendet die Verkettungsfunktion c(). Ich habe auch versucht , unmatrixaus gdata, aber es ist zu langsam hier erwähnt zu werden.

Hier sind einige der numerischen Ergebnisse, die ich erhalten habe:

> 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

Das Reduzieren einer Matrix ist eine übliche Operation beim maschinellen Lernen, bei der eine Matrix die zu lernenden Parameter darstellen kann, jedoch ein Optimierungsalgorithmus aus einer generischen Bibliothek verwendet wird, der einen Parametervektor erwartet. Daher ist es üblich, die Matrix (oder Matrizen) in einen solchen Vektor umzuwandeln. Dies ist bei der Standard-R-Funktion der Fall optim().

David Bellot
quelle
1

Sie können Joshuas Lösung verwenden, aber ich denke, Sie brauchen Elts_int <- as.matrix(tmp_int)

Oder für Schleifen:

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 ist ein 1d-Vektor.

Brandon Bertelsen
quelle
1

Einfach und schnell, da ein 1d-Array im Wesentlichen ein Vektor ist

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

Wenn Sie stattdessen einen data.frame (df) mit mehreren Spalten hatten und vektorisieren möchten, können Sie dies tun

as.matrix (df, ncol = 1)

Lee Sande
quelle