Ubah matriks menjadi larik 1 dimensi

110

Saya memiliki matriks (32X48).

Bagaimana cara mengubah matriks menjadi array dimensi tunggal?

Alos
sumber

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
Spacedman
sumber
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
Greg
sumber
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
aL3xa
sumber
14

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

Tian
sumber
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)
Joshua Ulrich
sumber
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

hema
sumber
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().

David Bellot
sumber
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.

Brandon Bertelsen
sumber
1

Sederhana dan cepat karena larik 1d pada dasarnya adalah vektor

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

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

sebagai matriks (df, ncol = 1)

Lee Sande
sumber