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

我有一个矩阵 (32X48)。

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

【问题讨论】:

    标签: arrays r matrix


    【解决方案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)

                【讨论】:

                  猜你喜欢
                  • 2018-11-20
                  • 1970-01-01
                  • 2023-04-05
                  • 1970-01-01
                  • 2018-12-28
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-10-12
                  • 2013-03-14
                  相关资源
                  最近更新 更多