Ubah matriks menjadi larik 1 dimensi


110

Saya memiliki matriks (32X48).

Bagaimana cara mengubah matriks menjadi array dimensi tunggal?

Jawaban:


214

Bacalah dengan 'scan', atau lakukan as.vector () pada matriks. Anda mungkin ingin mengubah urutan matriks terlebih dahulu jika Anda menginginkannya menurut baris atau kolom.

> 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

mencoba 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

Itu adalah vektor, dan bukan array 1-d.
hadley

hmm. Itu benar. Mungkin bukan larik 1-d, tapi vektor 1-d.
Greg

30

Jika kita berbicara tentang data.frame, maka Anda harus bertanya pada diri sendiri apakah variabel-variabel tersebut berjenis sama? Jika demikian, Anda dapat menggunakan rapply, atau unlist, karena data.frames adalah list, jauh di lubuk hati mereka ...

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

14

array(A)atau array(t(A))akan memberi Anda array 1-d.


12

Dari ?matrix: "Matriks adalah kasus khusus dari 'larik' dua dimensi." Anda cukup mengubah dimensi matriks / larik.

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

1
Tabel baca mengembalikan data.frame bukan matriks. Akankah ini tetap berfungsi tanpa as.matrix ()?
Brandon Bertelsen

6

Mungkin sudah sangat terlambat, bagaimanapun inilah cara saya mengubah Matriks menjadi vektor:

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

berharap itu akan membantu


4

Anda bisa menggunakan as.vector(). Sepertinya itu adalah metode tercepat menurut patokan kecil saya, sebagai berikut:

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)

Solusi pertama menggunakan as.vector(), yang kedua menggunakan fakta bahwa matriks disimpan sebagai array yang berdekatan dalam memori dan length(m)memberikan jumlah elemen dalam matriks m. Yang ketiga membuat contoh arraydari x, dan yang keempat menggunakan fungsi gabungan c(). Saya juga mencoba unmatrixdari gdata, tetapi terlalu lambat untuk disebutkan di sini.

Berikut adalah beberapa hasil numerik yang saya peroleh:

> 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

Meratakan matriks adalah operasi umum dalam Pembelajaran Mesin, di mana matriks dapat mewakili parameter yang akan dipelajari, tetapi matriks menggunakan algoritme pengoptimalan dari pustaka umum yang mengharapkan vektor parameter. Jadi adalah umum untuk mengubah matriks (atau matriks) menjadi vektor seperti itu. Ini halnya dengan fungsi R standar optim().


1

Anda dapat menggunakan solusi Joshua tetapi saya pikir Anda membutuhkannya Elts_int <- as.matrix(tmp_int)

Atau untuk 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 adalah vektor 1d.


1

Sederhana dan cepat karena larik 1d pada dasarnya adalah vektor

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

1

Jika Anda memiliki data.frame (df) yang memiliki banyak kolom dan Anda ingin melakukan vektorisasi, Anda dapat melakukannya

sebagai matriks (df, ncol = 1)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.