web-dev-qa-db-fra.com

Convertir une matrice en un tableau à 1 dimension

J'ai une matrice (32X48).

Comment puis-je convertir la matrice en un tableau à une dimension?

100
Alos

Lisez-le avec 'scan' ou faites as.vector () sur la matrice. Vous voudrez peut-être d'abord transposer la matrice si vous le souhaitez par lignes ou par colonnes.

> 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
201
Spacedman

Si nous parlons de data.frame, vous devriez vous demander si les variables sont du même type. Si c'est le cas, vous pouvez utiliser rapply, ou unlist, car les data.frames sont des listes, au plus profond de leur âme ...

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

essayez 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
29
Greg

array(A) ou array(t(A)) vous donnera un tableau 1-d.

12
Tian

De ?matrix: "Une matrice est le cas particulier d'un" tableau "à deux dimensions." Vous pouvez simplement changer les dimensions de la matrice/du tableau.

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

Il est peut-être si tard, de toute façon, voici comment procéder pour convertir Matrix en vecteur:

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

espérons que cela aidera

5
hema

vous pouvez utiliser as.vector(). Il semble que ce soit la méthode la plus rapide selon mon petit repère, comme suit:

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 première solution utilise as.vector(), la seconde utilise le fait qu'une matrice est stockée en mémoire sous forme de tableau contigu et que length(m) donne le nombre d'éléments dans une matrice m. Le troisième instancie un array à partir de x, et le quatrième utilise la fonction de concaténation c(). J'ai aussi essayé unmatrix de gdata, mais c'est trop lent pour être mentionné ici.

Voici quelques résultats numériques obtenus:

> 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'aplatissement d'une matrice est une opération courante dans Machine Learning, où une matrice peut représenter les paramètres à apprendre, mais on utilise un algorithme d'optimisation issu d'une bibliothèque générique qui attend un vecteur de paramètres. Il est donc courant de transformer la matrice (ou les matrices) en un tel vecteur. C'est le cas de la fonction standard R optim().

3
David Bellot

Si vous avez plutôt un fichier data.frame (df) à plusieurs colonnes et que vous souhaitez vectoriser, vous pouvez le faire.

as.matrix (df, ncol = 1)

1
Lee Sande

Simple et rapide car un tableau 1d est essentiellement un vecteur

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

Vous pouvez utiliser la solution de Joshua mais je pense que vous avez besoin de Elts_int <- as.matrix(tmp_int)

Ou pour les boucles:

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 est un vecteur 1d.

1
Brandon Bertelsen