Chuyển đổi ma trận thành mảng 1 chiều


110

Tôi có một ma trận (32X48).

Làm cách nào để chuyển đổi ma trận thành mảng một chiều?

Câu trả lời:


214

Đọc nó bằng 'scan', hoặc chỉ làm như.vector () trên ma trận. Bạn có thể muốn chuyển ma trận trước nếu bạn muốn nó theo hàng hoặc cột.

> 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

thử 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

Đó là một vectơ, và không phải là một mảng 1-d.
hadley

hmm. Đúng. Có lẽ không phải là mảng 1-d, mà là vectơ 1-d.
Greg

30

Nếu chúng ta đang nói về data.frame, thì bạn nên tự hỏi liệu các biến có cùng kiểu không? Nếu đúng như vậy, bạn có thể sử dụng rapply hoặc unlist, vì data.frames là danh sách, nằm sâu trong tâm hồn của chúng ...

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

14

array(A)hoặc array(t(A))sẽ cung cấp cho bạn một mảng 1-d.


12

Từ ?matrix: "Ma trận là trường hợp đặc biệt của 'mảng' hai chiều." Bạn chỉ có thể thay đổi kích thước của ma trận / mảng.

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

1
Bảng đọc trả về data.frame không phải là ma trận. Điều này sẽ vẫn hoạt động mà không có as.matrix ()?
Brandon Bertelsen

6

Có thể là quá muộn, dù sao đây là cách của tôi trong việc chuyển đổi Ma trận thành vectơ:

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

hy vọng điều đó sẽ giúp


4

bạn có thể sử dụng as.vector(). Có vẻ như nó là phương pháp nhanh nhất theo điểm chuẩn nhỏ của tôi, như sau:

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)

Giải pháp đầu tiên sử dụng as.vector(), giải pháp thứ hai sử dụng thực tế là một ma trận được lưu trữ dưới dạng một mảng liền kề trong bộ nhớ và length(m)cung cấp số phần tử trong ma trận m. Hàm thứ ba khởi tạo arraytừ xvà hàm thứ tư sử dụng hàm nối c(). Tôi cũng đã thử unmatrixtừ gdata, nhưng nó quá chậm để được đề cập ở đây.

Dưới đây là một số kết quả số mà tôi thu được:

> 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àm phẳng ma trận là một hoạt động phổ biến trong Học máy, trong đó ma trận có thể đại diện cho các tham số cần tìm hiểu nhưng người ta sử dụng một thuật toán tối ưu hóa từ một thư viện chung mong đợi một vectơ tham số. Vì vậy người ta thường biến ma trận (hoặc các ma trận) thành một vectơ như vậy. Đó là trường hợp của hàm R tiêu chuẩn optim().


1

Bạn có thể sử dụng giải pháp của Joshua nhưng tôi nghĩ bạn cần Elts_int <- as.matrix(tmp_int)

Hoặc cho các vòng lặp:

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 là một vectơ 1d.


1

Đơn giản và nhanh chóng vì mảng 1d về cơ bản là một vectơ

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

1

Thay vào đó, nếu bạn có data.frame (df) có nhiều cột và bạn muốn vectơ hóa, bạn có thể làm

as.matrix (df, ncol = 1)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.