マトリックス(32X48)があります。
行列を1次元配列に変換するにはどうすればよいですか?
'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
Data.frameについて話している場合、同じ型の変数であると自問する必要がありますか?その場合、data.framesは魂の奥深くにあるリストなので、rapplyまたはunlistを使用できます...
data(mtcars)
unlist(mtcars)
rapply(mtcars, c) # completely stupid and pointless, and slower
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
array(A)
またはarray(t(A))
は、1次元配列を提供します。
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)
それはとても遅いかもしれません、とにかくここにマトリックスをベクトルに変換する私の方法があります:
library(gdata)
vector_data<- unmatrix(yourdata,byrow=T))
それが役立つことを願って
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番目はarray
から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
マトリックスの平坦化は、機械学習の一般的な操作であり、マトリックスは学習するパラメーターを表すことができますが、パラメーターのベクトルを予期する汎用ライブラリーの最適化アルゴリズムを使用します。そのため、マトリックスをこのようなベクトルに変換するのが一般的です。標準のR関数optim()
の場合です。
代わりに、複数の列を持つdata.frame(df)があり、ベクトル化する場合は、次のようにします。
as.matrix(df、ncol = 1)
1D配列は本質的にベクトルであるため、シンプルで高速
vector <- array[1:length(array)]
ジョシュアのソリューションを使用できますが、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ベクトルです。