แปลงเมทริกซ์เป็นอาร์เรย์ 1 มิติ


111

ฉันมีเมทริกซ์ (32X48)

ฉันจะแปลงเมทริกซ์เป็นอาร์เรย์มิติเดียวได้อย่างไร

คำตอบ:


215

ไม่ว่าจะอ่านด้วย 'scan' หรือทำ as.vector () บนเมทริกซ์ คุณอาจต้องการเปลี่ยนเมทริกซ์ก่อนถ้าคุณต้องการเป็นแถวหรือคอลัมน์

> 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

ลอง 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

นั่นคือเวกเตอร์ไม่ใช่อาร์เรย์ 1 มิติ
hadley

อืม. นั่นคือเรื่องจริง บางทีอาจไม่ใช่อาร์เรย์ 1 มิติ แต่เป็นเวกเตอร์ 1 มิติ
Greg

30

หากเรากำลังพูดถึง data.frame คุณควรถามตัวเองว่าเป็นตัวแปรประเภทเดียวกันหรือไม่? หากเป็นเช่นนั้นคุณสามารถใช้ rapply หรือไม่อยู่ในรายการได้เนื่องจาก data.frames เป็นรายการที่อยู่ลึกลงไปในจิตวิญญาณของพวกเขา ...

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


12

จาก?matrix: "เมทริกซ์เป็นกรณีพิเศษของ 'อาร์เรย์' สองมิติ" คุณสามารถเปลี่ยนขนาดของเมทริกซ์ / อาร์เรย์ได้

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

1
Read table ส่งคืน data.frame ไม่ใช่เมทริกซ์ จะยังคงใช้งานได้หากไม่มี as.matrix () หรือไม่
Brandon Bertelsen

6

มันอาจจะสายไปแล้วนี่คือวิธีของฉันในการแปลงเมทริกซ์เป็นเวกเตอร์:

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

หวังว่าจะช่วยได้


4

คุณสามารถใช้as.vector(). ดูเหมือนว่าจะเป็นวิธีที่เร็วที่สุดตามเกณฑ์มาตรฐานเล็ก ๆ ของฉันดังนี้:

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)

ครั้งแรกที่ใช้วิธีการแก้ปัญหาas.vector()ที่สองใช้ความจริงที่ว่าเมทริกซ์จะถูกเก็บไว้เป็น array ที่ต่อเนื่องกันในหน่วยความจำและช่วยให้จำนวนขององค์ประกอบในเมทริกซ์length(m) mที่สาม instantiates arrayจากxและการใช้งานที่สี่ concatenate c()ฟังก์ชัน ฉันลองunmatrixจากgdataแต่มันช้าเกินไปที่จะพูดถึงที่นี่

นี่คือผลลัพธ์ที่เป็นตัวเลขบางส่วนที่ฉันได้รับ:

> 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

การทำให้เมทริกซ์แบนเป็นการดำเนินการทั่วไปในแมชชีนเลิร์นนิงซึ่งเมทริกซ์สามารถแสดงถึงพารามิเตอร์ที่จะเรียนรู้ แต่อย่างใดอย่างหนึ่งใช้อัลกอริทึมการปรับให้เหมาะสมจากไลบรารีทั่วไปซึ่งคาดว่าจะมีเวกเตอร์ของพารามิเตอร์ ดังนั้นจึงเป็นเรื่องปกติที่จะเปลี่ยนเมทริกซ์ (หรือเมทริกซ์) ให้เป็นเวกเตอร์ดังกล่าว optim()มันเป็นกรณีที่มีฟังก์ชั่น R มาตรฐาน


1

คุณสามารถใช้วิธีแก้ปัญหาของ Joshua แต่ฉันคิดว่าคุณต้องการ Elts_int <- as.matrix(tmp_int)

หรือสำหรับลูป:

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


1

ง่ายและรวดเร็วเนื่องจากอาร์เรย์ 1d เป็นเวกเตอร์เป็นหลัก

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

1

หากคุณมี data.frame (df) ที่มีหลายคอลัมน์และคุณต้องการ vectorize คุณสามารถทำได้

as.matrix (df, ncol = 1)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.