上下文 我有数百个光栅堆栈,每个堆栈的层数相同。每个堆栈覆盖较大研究区域的不同方形地理区块。每个堆栈可以有一个或多个层;这些我等同于图像频道。因此,每个堆栈可以被视为(x,y,c)的3D阵列。我想获取 z 数量的光栅堆栈并将它们转换为(z,x,y,c)的4D数组。其目的是格式化这些数据,以便在Keras中训练一个需要“通道最后”(z,x,y,c)数组的网络。
问题: 如何将栅格堆栈表示为多通道图像并转换为4D阵列形状(z,x,y,c)?
Reprex:
library(raster)
## three layers/channels for tile #1
x1_1 <- raster(ncol=2,nrow=2)
x1_1[] <- c(11:14)
x1_2 <- raster(ncol=2,nrow=2)
x1_2[] <- c(15:18)
x1_3 <- raster(ncol=2,nrow=2)
x1_3[] <- c(19:22)
# three layers/channels for tile #2
x2_1 <- raster(ncol=2,nrow=2)
x2_1[] <- c(21:24)
x2_2 <- raster(ncol=2,nrow=2)
x2_2[] <- c(25:28)
x2_3 <- raster(ncol=2,nrow=2)
x2_3[] <- c(29:32)
# stack channels from each tile
x1 <- stack(x1_1,x1_2,x1_3)
x2 <- stack(x2_1,x2_2,x2_3)
dim(x1) # (2,2,3)
# cast vectors of each
array(c(as.vector(x1),as.vector(x2)),c(2,2,2,3))
这会将堆栈转换为4D数组,但顺序不正确。
, , 1, 1
[,1] [,2]
[1,] 11 13
[2,] 12 14
, , 2, 1
[,1] [,2]
[1,] 15 17
[2,] 16 18
, , 1, 2
[,1] [,2]
[1,] 19 21
[2,] 20 22
...
x和y被转置,顺序按每个堆栈的第4(通道)维度排序。所需的排序是将第一个维度作为栅格堆栈/瓦片的数量 z ,然后是x,y,最后是每个栅格的通道(在本例中为1到3)。 R中的打印顺序为(z,x,y,c),枚举为(1,2,2,1);(1,2,2,2);(1,2,2,3);(2 ,2,2,1);(2,2,2,2);(2,2,2,3)
我意识到我并没有太好地解释这个问题,因为我过去没有过多处理多维数组。任何帮助,将不胜感激。
答案 0 :(得分:0)
您是否需要输出为数组或栅格?如果是一个数组,aperm
函数就是你所需要的(ex):
arr <- array(c(as.vector(x1),as.vector(x2)),c(2,2,2,3))
aperm(arr, c(3,1,2,4))