将矩阵转换为一维数组


110

我有一个矩阵(32X48)。

如何将矩阵转换为一维数组?

Answers:


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

那是一个向量,而不是一维数组。
hadley 2010年

嗯。确实如此。也许不是一维数组,而是一维向量。
格雷格2010年

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))将为您提供一维数组。


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
读取表返回一个data.frame而不是一个矩阵。如果没有as.matrix(),这仍然可以工作吗?
布兰登·贝特尔森

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()。我也尝试unmatrixgdata,但它是在这里提到过慢。

这是我获得的一些数值结果:

> 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

您可以使用约书亚的解决方案,但我认为您需要 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

简单和快速,因为一维数组本质上是一个向量

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

1

相反,如果您有一个具有多个列的data.frame(df),并且想要进行矢量化,则可以执行

as.matrix(df,ncol = 1)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.