行列を1次元配列に変換する


110

マトリックス(32X48)があります。

行列を1次元配列に変換するにはどうすればよいですか?

回答:


214

'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

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次元配列ではありません。
ハドレー

うーん。それは本当だ。おそらく1次元配列ではなく、1次元ベクトルです。
グレッグ

30

data.frameについて話している場合、同じ型の変数であるかどうかを自問する必要がありますか?その場合は、rapply、またはunlistを使用できます。data.framesはリストなので、魂の奥深くにあります...

 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、2010

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()、2番目のソリューションは行列がメモリ内の連続した配列として格納されlength(m)、行列内の要素の数を提供するという事実を使用しますm。3番目はarrayfromをインスタンス化xし、4番目は連結関数を使用します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

行列の平坦化は機械学習の一般的な操作です。ここでは、行列は学習するパラメーターを表すことができますが、パラメーターのベクトルを期待する汎用ライブラリーの最適化アルゴリズムを使用します。そのため、行列(1つまたは複数)をそのようなベクトルに変換するのが一般的です。これは標準のR関数の場合optim()です。


1

あなたはジョシュアの解決策を使うことができますが、私はあなたが必要だと思います 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

1次元配列は基本的にベクトルであるため、シンプルで高速

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

1

代わりに複数の列を持つdata.frame(df)があり、ベクトル化したい場合は、

as.matrix(df、ncol = 1)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.