当我注意到这一点时,我正在R中尝试一些东西。我用零初始化一个3D数组,然后使用超出范围的第一个索引进行赋值操作。
arr = array(0, c(22, 246, 2))
arr[3463] = 0.15
现在我也可以使用arr[9, 158, 1]
访问此值。
arr[3463] == arr[9, 158, 1]
返回TRUE
如何将超出范围的第一个索引(3463
)映射到3个索引(9, 158, 1
)?
答案 0 :(得分:4)
数组只是具有维度属性的向量。因此,您还可以使用向量子集分配。使用二维数组a.k.a.矩阵更容易看到:
m <- matrix(1:16, 4)
dput(m)
#structure(1:16, .Dim = c(4L, 4L))
m[7] <- 0
m
# [,1] [,2] [,3] [,4]
#[1,] 1 5 9 13
#[2,] 2 6 10 14
#[3,] 3 0 11 15
#[4,] 4 8 12 16
注意向量中的第七个值是如何改变的。
答案 1 :(得分:2)
数组不过是一个属性为维度的向量。因此,数组的总长度为22*246*2 = 10824
,而3463
不是arr
中的索引。
现在要了解为什么存在这种映射arr[3463] == arr[9, 158, 1]
,这是一个简单的算术:3463 = 157*22+9
。
带有索引的数组中的值(使3463
)取最左边的维度。因此,您从第一列的第一个22*246
元素矩阵开始,每行读取一行。你读了所有数据(22
)。然后转到第二列并读取所有行(在此阶段您读取44
数据)。等等。
您最终到达第一个矩阵的9
列的行158
。