R:将多个栅格堆栈投射到4D阵列中

时间:2018-01-24 20:23:08

标签: arrays r keras raster

上下文 我有数百个光栅堆栈,每个堆栈的层数相同。每个堆栈覆盖较大研究区域的不同方形地理区块。每个堆栈可以有一个或多个层;这些我等同于图像频道。因此,每个堆栈可以被视为(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)

我意识到我并没有太好地解释这个问题,因为我过去没有过多处理多维数组。任何帮助,将不胜感激。

1 个答案:

答案 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))