将矩阵转换为1维数组

时间:2010-09-29 15:38:57

标签: arrays r matrix

我有一个矩阵(32X48)。

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

11 个答案:

答案 0 :(得分:196)

使用'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

答案 1 :(得分:28)

如果我们谈论的是data.frame,那么你应该问自己是同一类型的变量吗?如果是这种情况,你可以使用rapply或unlist,因为data.frames是列表,深入到他们的灵魂......

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

答案 2 :(得分:26)

尝试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

答案 3 :(得分:11)

来自?matrix:“矩阵是二维'数组'的特例。”您只需更改矩阵/数组的尺寸即可。

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

答案 4 :(得分:11)

array(A)array(t(A))将为您提供一维数组。

答案 5 :(得分:5)

可能会这么晚,无论如何,这是我将Matrix转换为vector的方式:

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

希望有所帮助

答案 6 :(得分:3)

您可以使用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中元素的数量。第三个实例化来自array的{​​{1}},第四个使用连接函数x。我也尝试过来自c()的{​​{1}},但这里提到的速度太慢了。

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

unmatrix

展平矩阵是机器学习中的常见操作,其中矩阵可以表示要学习的参数,但是人们使用来自期望参数矢量的通用库的优化算法。因此,将矩阵(或矩阵)转换为这样的矢量是很常见的。标准R函数gdata就属于这种情况。

答案 7 :(得分:1)

您可以使用Joshua的解决方案,但我认为您需要Elts_int <- as.matrix(tmp_int)

或for 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向量。

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

如果你有一个data.frame(df),它有多列,你想要矢量化,你可以做

as.matrix(df,ncol = 1)

答案 10 :(得分:1)

对于那些不仅要生成数组,还要生成具有相应行和列名称的数组的人,我推荐使用 this 答案中的melt 函数。

library(reshape2)
df.L <- melt( df, id.vars="New_name4_rownames",
               value.name="NAME_of_VALUE", variable.name="New_name4_colnames" )
print(df.L)

然后您可以根据需要组合行和列的名称,并使用 spread/pivot_wider 使列名称成为矩阵的行+列名称和作为向量的 1 行的组合。

df.L$Both <- paste0(df.L$New_name4_rownames, "_", df.L$New_name4_colnames)
df.sel <- df.L[,3:4] #select only values and combined column names
output1d <- pivot_wider(data = df.sel, names_from = Both, values_from = NAME_of_VALUE)