J'ai une matrice (32X48).
Comment puis-je convertir la matrice en un tableau à une dimension?
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
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
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
array(A)
ou array(t(A))
vous donnera un tableau 1-d.
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)
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
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()
.
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)
Simple et rapide car un tableau 1d est essentiellement un vecteur
vector <- array[1:length(array)]
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.