R在多维数组中进行子集化和分配
R subsetting and assigning in a multidimensional array
我正在使用带有 3D 维数组的 R。我正在尝试将它用作不同时间点的一组 2D 矩阵。
我发现了一个我真的不明白的行为,我想知道为什么 会发生。我试图在这里和其他地方找到解释,但直到现在我仍然有疑问。
我有这样的 3D 阵列:
array3D=array(1:45,c(5,3,3))
正如我所料,我可以访问一个单独的 2D 矩阵
array3D[1,,]
[,1] [,2] [,3]
[1,] 1 16 31
[2,] 6 21 36
[3,] 11 26 41
但是尝试访问两个 2D 矩阵时我没有得到我期望的结果
array3D[1:2,,]
, , 1
[,1] [,2] [,3]
[1,] 1 6 11
[2,] 2 7 12
, , 2
[,1] [,2] [,3]
[1,] 16 21 26
[2,] 17 22 27
, , 3
[,1] [,2] [,3]
[1,] 31 36 41
[2,] 32 37 42
我发现我可以使用 aperm(array3D[1:2,,])
解决这个问题,但我不明白在做什么。
另一个问题是当我尝试做作业时,我不明白为什么这不起作用
array3D[1:2,,]=matrix(9:1,3,3)
array3D[1,,]
[,1] [,2] [,3]
[1,] 9 3 6
[2,] 7 1 4
[3,] 5 8 2
我认为我可以用循环或 aaply
来解决这个问题,正如我在这里读到的那样,但我认为如果我想使用 3D 数组,理解正在发生的事情真的很重要。如果有人能给我指出正确的方向,我会很高兴。
我试图在这里找到答案并阅读 http://adv-r.had.co.nz/ 但到目前为止没有运气。
更新
我发现如果不使用第一个索引而使用最后一个索引,一切都会正常,但我仍然不明白为什么。
是 R 固有的东西吗?
可以用其他方式使用第一个吗?
array3D=array(1:45,c(3,3,5))
array3D[,,1:2]=matrix(9:1,3,3)
array3D[,,2]
[,1] [,2] [,3]
[1,] 9 6 3
[2,] 8 5 2
[3,] 7 4 1
我认为你想要实现的目标不是很清楚,但这里有一些例子:
关于你的第一点,你可以 select z 方向上的三个三乘三矩阵中的两个,方法是:
array3D[,,1:2]
因此,您可以用适当大小的数组替换:
array3D[,,1:2] <- array(18:1,c(3,3,2))
关于你为什么要使用第三个索引的问题:把它想象成三维坐标系中的z方向。行是 x 方向(垂直),列是 y 方向(水平)。在索引 array3D[1:2,,]
时,您 select 编辑了前两行,同时保持 x 和 z 方向上的所有内容。
我正在使用带有 3D 维数组的 R。我正在尝试将它用作不同时间点的一组 2D 矩阵。
我发现了一个我真的不明白的行为,我想知道为什么 会发生。我试图在这里和其他地方找到解释,但直到现在我仍然有疑问。
我有这样的 3D 阵列:
array3D=array(1:45,c(5,3,3))
正如我所料,我可以访问一个单独的 2D 矩阵
array3D[1,,]
[,1] [,2] [,3]
[1,] 1 16 31
[2,] 6 21 36
[3,] 11 26 41
但是尝试访问两个 2D 矩阵时我没有得到我期望的结果
array3D[1:2,,]
, , 1
[,1] [,2] [,3]
[1,] 1 6 11
[2,] 2 7 12
, , 2
[,1] [,2] [,3]
[1,] 16 21 26
[2,] 17 22 27
, , 3
[,1] [,2] [,3]
[1,] 31 36 41
[2,] 32 37 42
我发现我可以使用 aperm(array3D[1:2,,])
解决这个问题,但我不明白在做什么。
另一个问题是当我尝试做作业时,我不明白为什么这不起作用
array3D[1:2,,]=matrix(9:1,3,3)
array3D[1,,]
[,1] [,2] [,3]
[1,] 9 3 6
[2,] 7 1 4
[3,] 5 8 2
我认为我可以用循环或 aaply
来解决这个问题,正如我在这里读到的那样,但我认为如果我想使用 3D 数组,理解正在发生的事情真的很重要。如果有人能给我指出正确的方向,我会很高兴。
我试图在这里找到答案并阅读 http://adv-r.had.co.nz/ 但到目前为止没有运气。
更新
我发现如果不使用第一个索引而使用最后一个索引,一切都会正常,但我仍然不明白为什么。 是 R 固有的东西吗? 可以用其他方式使用第一个吗?
array3D=array(1:45,c(3,3,5))
array3D[,,1:2]=matrix(9:1,3,3)
array3D[,,2]
[,1] [,2] [,3]
[1,] 9 6 3
[2,] 8 5 2
[3,] 7 4 1
我认为你想要实现的目标不是很清楚,但这里有一些例子: 关于你的第一点,你可以 select z 方向上的三个三乘三矩阵中的两个,方法是:
array3D[,,1:2]
因此,您可以用适当大小的数组替换:
array3D[,,1:2] <- array(18:1,c(3,3,2))
关于你为什么要使用第三个索引的问题:把它想象成三维坐标系中的z方向。行是 x 方向(垂直),列是 y 方向(水平)。在索引 array3D[1:2,,]
时,您 select 编辑了前两行,同时保持 x 和 z 方向上的所有内容。