将矩阵转换为一维数组

Posted

技术标签:

【中文标题】将矩阵转换为一维数组【英文标题】:Convert a matrix to a 1 dimensional array 【发布时间】:2011-04-18 21:39:44 【问题描述】:

我有一个矩阵 (32X48)。

如何?

【问题讨论】:

【参考方案1】:

要么使用“扫描”读取它,要么只是在矩阵上执行 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

【讨论】:

似乎as.vector() 将按列主要顺序变平,即对于2x2 矩阵m,将返回c(m[1, 1], m[2,1], m[1, 2], m[2, 2])。因此,这与使用 matrix(vec) 将向量转换为矩阵完全相反,因为默认情况下 byrow 为 false。【参考方案2】:

试试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】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

来自?matrix:“矩阵是二维‘数组’的特例。”您可以简单地更改矩阵/数组的尺寸。

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

【讨论】:

读取表返回 data.frame 而不是矩阵。如果没有 as.matrix() ,这仍然有效吗?【参考方案6】:

您可以使用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 中的元素数。第三个从x 实例化一个array,第四个使用连接函数c()。我也从gdata 尝试了unmatrix,但是太慢了,这里就不提了。

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

> 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() 就是这种情况。

【讨论】:

【参考方案7】:

可能已经晚了,反正这是我将矩阵转换为向量的方法:

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

希望对你有所帮助

【讨论】:

【参考方案8】:

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

result <- matrix[1:length(matrix)]

【讨论】:

这实际上是写c(matrix)as.vector(matrix) 的一段很长的路。【参考方案9】:

对于希望生成的不仅仅是数组,而是具有相应行和列名称的数组的任何人,我建议使用 melt 函数,如this 答案。

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)

【讨论】:

【参考方案10】:

您可以使用 Joshua 的解决方案,但我认为您需要 Elts_int &lt;- 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 是一维向量。

【讨论】:

【参考方案11】:

如果您有一个包含多列的 data.frame (df) 并且您想要矢量化,您可以这样做

as.matrix(df, ncol=1)

【讨论】:

以上是关于将矩阵转换为一维数组的主要内容,如果未能解决你的问题,请参考以下文章

C语言一维数组转二维数组

将多维数组转换为一维数组的算法

将二维 JavaScript 数组转换为一维数组 [重复]

C将一维数组转换为二维数组

将二维数组转换为一维数组,交替其值

如何使用 numpy 从一维数组创建对角矩阵?