Bir matrisi 1 boyutlu bir diziye dönüştürme


111

Bir matrisim var (32X48).

Matrisi nasıl tek boyutlu bir diziye dönüştürebilirim?

Yanıtlar:


215

Ya 'tarama' ile okuyun ya da matris üzerinde olduğu gibi yapın. Vektör (). Satırlara veya sütunlara göre istiyorsanız, önce matrisi transpoze etmek isteyebilirsiniz.

> 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

33

Deneyin 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

Bu bir vektör, 1-d dizisi değil.
hadley

hı. Bu doğru. Belki 1 boyutlu bir dizi değil, 1 boyutlu bir vektör.
Greg

30

Data.frame'den bahsediyorsak, o zaman kendinize aynı türden değişkenler olup olmadığını sormalısınız. Durum buysa, rapply veya unlist kullanabilirsiniz, çünkü data.frames, ruhlarının derinliklerinde listelerdir ...

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

14

array(A)veya array(t(A))size 1 boyutlu bir dizi verecektir.


12

From ?matrix: "Bir matris, iki boyutlu bir 'dizinin' özel durumudur." Matrisin / dizinin boyutlarını kolayca değiştirebilirsiniz.

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

1
Okuma tablosu matris değil data.frame döndürür. Bu yine de as.matrix () olmadan çalışacak mı?
Brandon Bertelsen

6

Çok geç olabilir, her neyse işte Matrix'i vektöre dönüştürme yolum:

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

umarım yardımcı olur


4

kullanabilirsiniz as.vector(). Aşağıdaki gibi benim küçük ölçütüme göre en hızlı yöntem gibi görünüyor:

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)

İlk çözüm as.vector(), bir matrisin bellekte bitişik bir dizi olarak saklandığı ve length(m)bir matristeki elemanların sayısını verdiği gerçeğini kullanır m. Üçüncüsü , bir arrayfrom örneğini oluşturur xve dördüncü, concatenate işlevini kullanır c(). Ben de denedim unmatrixgelen gdata, ancak burada belirtilmesi gereken çok yavaş.

İşte elde ettiğim sayısal sonuçlardan bazıları:

> 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

Bir matrisin düzleştirilmesi, Makine Öğreniminde yaygın bir işlemdir, burada bir matris öğrenilecek parametreleri temsil edebilir, ancak biri bir parametre vektörü bekleyen genel bir kitaplıktan bir optimizasyon algoritması kullanır. Dolayısıyla matrisi (veya matrisleri) böyle bir vektöre dönüştürmek yaygındır. Standart R işlevinde durum böyledir optim().


1

Joshua'nın çözümünü kullanabilirsiniz ama bence ihtiyacınız var Elts_int <- as.matrix(tmp_int)

Veya döngüler için:

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 1d vektördür.


1

Basit ve hızlı bir 1d dizisi aslında bir vektördür

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

1

Bunun yerine, birden çok sütunu olan bir data.frame (df) varsa ve vektörleştirmek istiyorsanız, şunları yapabilirsiniz:

as.matrix (df, ncol = 1)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.