【问题标题】:How to convert matrix into array?如何将矩阵转换为数组?
【发布时间】:2012-03-05 19:27:19
【问题描述】:

我有一个大型数据集,我想将其转换为数组。但是,例如,让我们举一个简单的例子。 我有以下矩阵

`\begin{table}[ht]
\begin{center}
\begin{tabular}{rrrrrrr}
\hline
& 1 & 2 & 3 & 4 & 5 & 6 \\ 
\hline
1 &   1 &  11 &  21 &  31 &  41 &  51 \\ 
2 &   2 &  12 &  22 &  32 &  42 &  52 \\ 
3 &   3 &  13 &  23 &  33 &  43 &  53 \\ 
4 &   4 &  14 &  24 &  34 &  44 &  54 \\ 
5 &   5 &  15 &  25 &  35 &  45 &  55 \\ 
6 &   6 &  16 &  26 &  36 &  46 &  56 \\ 
7 &   7 &  17 &  27 &  37 &  47 &  57 \\ 
8 &   8 &  18 &  28 &  38 &  48 &  58 \\ 
9 &   9 &  19 &  29 &  39 &  49 &  59 \\ 
10 &  10 &  20 &  30 &  40 &  50 &  60 \\ 
\hline
\end{tabular}
\end{center}
\end{table}
`

我需要将此矩阵转换为维度 (5,6,2) 的数组,其中第一个矩阵包含前五行“x”,第二个矩阵将包含最后 5 行。 我试过了

dim(x)<-c(5,6,2)

这使得矩阵 1 具有 1:30 的连续数字,然后矩阵 2 具有 31:60 的连续数字。这不是我的要求。

提前致谢。

【问题讨论】:

  • 您可以从 array(yourMatrixHere, dim = c(5,6,2) 开始...您可能需要弄清楚它是如何填充这些维度的。
  • 您能否进一步解释一下我如何要求 R 填充这些数组?

标签: arrays r matrix transformation


【解决方案1】:

您提供的是 LaTeX 表示。 R中的相同矩阵将是

M <- matrix(1:60, ncol=6)  # a 10 x 6 matrix

考虑使用包“abind”中的abind

require(abind)
abind( M[1:5,], M[6:10, ], along=3 )
#-----------------
, , 1

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1   11   21   31   41   51
[2,]    2   12   22   32   42   52
[3,]    3   13   23   33   43   53
[4,]    4   14   24   34   44   54
[5,]    5   15   25   35   45   55

, , 2

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    6   16   26   36   46   56
[2,]    7   17   27   37   47   57
[3,]    8   18   28   38   48   58
[4,]    9   19   29   39   49   59
[5,]   10   20   30   40   50   60

如果您不想使用外部包并且愿意接受每个切片的转置版本,请先转置然后重新维度。您不能转置数组,但是可以查看 aperm 函数:

Mt <- t(M)
dim(Mt) <- c(6, 5, 2)
Mt
, , 1

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]   11   12   13   14   15
[3,]   21   22   23   24   25
[4,]   31   32   33   34   35
[5,]   41   42   43   44   45
[6,]   51   52   53   54   55

, , 2

     [,1] [,2] [,3] [,4] [,5]
[1,]    6    7    8    9   10
[2,]   16   17   18   19   20
[3,]   26   27   28   29   30
[4,]   36   37   38   39   40
[5,]   46   47   48   49   50
[6,]   56   57   58   59   60

aperm 解决方案:

> aperm(Mt, c(2,1,3))
, , 1

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1   11   21   31   41   51
[2,]    2   12   22   32   42   52
[3,]    3   13   23   33   43   53
[4,]    4   14   24   34   44   54
[5,]    5   15   25   35   45   55

, , 2

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    6   16   26   36   46   56
[2,]    7   17   27   37   47   57
[3,]    8   18   28   38   48   58
[4,]    9   19   29   39   49   59
[5,]   10   20   30   40   50   60

【讨论】:

【解决方案2】:

怎么样:

M <- matrix(1:60,nrow=10)

M2 <- lapply(split(M,0:9%/%5),matrix,nrow=5)
M2
$`0`
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1   11   21   31   41   51
[2,]    2   12   22   32   42   52
[3,]    3   13   23   33   43   53
[4,]    4   14   24   34   44   54
[5,]    5   15   25   35   45   55

$`1`
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    6   16   26   36   46   56
[2,]    7   17   27   37   47   57
[3,]    8   18   28   38   48   58
[4,]    9   19   29   39   49   59
[5,]   10   20   30   40   50   60

如果你真的需要array:

array(unlist(M2),c(5,6,2))

【讨论】:

    【解决方案3】:

    我无法判断您的示例数据是否真的是那种 XML-ish 形式,或者只是看起来那样 :-) 。只要您目前在 R 中有一个充满数据的二维矩阵,Chase 的答案可能就可以了。如果您想非常小心,请尝试

    data.cube <- array(NA, dim = c(5,6,2))  
    data.cube[,,1] <- your.matrix[1:5,]  
    data.cube[,,2] <- your.matrix[6:10,]   
    

    这有点迂腐,但我希望它能指出一些在 R 中将数据提供给数组的便捷方法。

    【讨论】:

    • 感谢您的回复。但实际上我需要一些技巧来处理大型矩阵。
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多