행렬을 1 차원 배열로 변환


110

매트릭스 (32X48)가 있습니다.

행렬을 1 차원 배열로 어떻게 변환 할 수 있습니까?

답변:


214

'스캔'으로 읽거나 행렬에서 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

32

시험 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 또는 unlist를 사용할 수 있습니다.

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

14

array(A)또는 array(t(A))1 차원 배열을 제공합니다.


12

From ?matrix: "행렬은 2 차원 '배열'의 특별한 경우입니다." 행렬 / 배열의 크기를 간단히 변경할 수 있습니다.

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

1
읽기 테이블은 행렬이 아닌 data.frame을 반환합니다. as.matrix () 없이도 여전히 작동합니까?
Brandon Bertelsen

6

너무 늦었을 수도 있습니다. 어쨌든 Matrix를 벡터로 변환하는 방법은 다음과 같습니다.

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()하고 두 번째 솔루션은 행렬이 메모리에 연속 배열로 저장되어 행렬 length(m)의 요소 수를 제공 한다는 사실을 사용합니다 m. 세 번째는 arrayfrom을 인스턴스화 x하고 네 번째는 연결 함수를 사용합니다 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

행렬 평탄화는 기계 학습에서 일반적인 작업으로, 행렬은 학습 할 매개 변수를 나타낼 수 있지만 매개 변수 벡터를 예상하는 일반 라이브러리의 최적화 알고리즘을 사용합니다. 따라서 행렬 (또는 행렬)을 이러한 벡터로 변환하는 것이 일반적입니다. 표준 R 기능이있는 경우입니다 optim().


1

Joshua의 솔루션을 사용할 수 있지만 필요하다고 생각합니다. Elts_int <- as.matrix(tmp_int)

또는 for 루프 :

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)이 있고 벡터화하려면 다음을 수행 할 수 있습니다.

as.matrix (df, ncol = 1)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.