如何基于一些分割值分割二维数组(矩阵)?

时间:2019-06-12 15:07:04

标签: python r algorithm matrix split

给出如下矩阵:

m = matrix(c(c(0,0,0,0,0,1,1,1,0,0),
             c(0,0,1,0,0,0,0,1,0,0),
             c(0,1,0,1,1,1,0,0,0,0),
             c(0,1,0,0,0,1,0,1,0,0),
             c(0,0,1,0,0,1,0,1,0,0),
             c(0,0,1,1,1,1,0,1,0,0),
             c(0,0,1,1,1,0,0,1,0,0),
             c(0,0,0,0,0,0,0,0,0,0)), ncol = 10, byrow = T)

我可能会以某种方式应用一维split函数。例如:对于第[1]行

  

0 1 1 0 0 1 1 1 0 0

split(row[1]) = [1 1 1], [1 1],因为我将零作为剪切和修剪值。因此,在我的数组示例中,我希望得到3个较小的矩阵: M 1

a = matrix(c(c(0,1,0,0,0),
             c(1,0,1,1,1),
             c(1,0,0,0,1),
             c(0,1,0,0,1),
             c(0,1,1,1,1),
             c(0,1,1,1,0)), ncol = 5, byrow = T)

M 2

b = matrix(c(c(1,1,1),
             c(0,0,1)), ncol = 3, byrow = T)

M 3

c = matrix(c(c(1),
             c(1),
             c(1),
             c(1)), ncol = 1, byrow = T)

如果我没记错的话。这是实现它的一些简单方法吗?我现在使用R(但可能是Python)进行编码。基本上,我可以将其用于1D,但在2D中,由于行依赖列,因此变得棘手。顺便说一句,我需要保存原始位置的坐标。

编辑 我已将输入编辑为可复制的。我的栅格解决方案很受欢迎:如何保留坐标或原始矩阵? 也就是说,原始矩阵中每个新矩阵的行和列ID。

1 个答案:

答案 0 :(得分:2)

我不确定我是否100%理解,但这是一个光栅解决方案。首先,我创建矩阵。

# Create matrix
mat <- as.matrix(read.table(text  = "0 0 0 0 0 1 1 1 0 0

0 0 1 0 0 0 0 1 0 0

0 1 0 1 1 1 0 0 0 0

0 1 0 0 0 1 0 1 0 0

0 0 1 0 0 1 0 1 0 0

0 0 1 1 1 1 0 1 0 0

0 0 1 1 1 0 0 1 0 0

0 0 0 0 0 0 0 0 0 0"))

然后,我加载raster库并将矩阵转换为栅格。

# Load raster library
library(raster)
#> Loading required package: sp

# Convert to raster
ras <- raster(mat)

在这里,我发现成群的细胞。

# Create clumps including diagonals
clu <- clump(ras, directions = 8)
#> Loading required namespace: igraph

此功能提取每个团块。

# Extract & trim clumps, then turn NAs to zeros
clumpy <- function(x){
  tmp <- as.matrix(trim(match(clu, x)))
  tmp[is.na(tmp)] <- 0
  tmp
}

在这里,我将函数应用于所有块。

lapply(unique(clu), clumpy)
#> [[1]]
#>      [,1] [,2] [,3]
#> [1,]    1    1    1
#> [2,]    0    0    1
#> 
#> [[2]]
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]    0    1    0    0    0
#> [2,]    1    0    1    1    1
#> [3,]    1    0    0    0    1
#> [4,]    0    1    0    0    1
#> [5,]    0    1    1    1    1
#> [6,]    0    1    1    1    0
#> 
#> [[3]]
#>      [,1]
#> [1,]    1
#> [2,]    1
#> [3,]    1
#> [4,]    1

reprex package(v0.3.0)于2019-06-12创建


这是clumpy的版本,其中保留行号和列号。

# Extract & trim clumps, then turn NAs to zeros
clumpy <- function(x){
  # Find clump
  foo <- as.matrix(match(clu, x))
  # Rename columns & rows
  colnames(foo) <- 1:ncol(foo)
  rownames(foo) <- 1:nrow(foo)
  # Trim
  tmp <- as.matrix(trim(foo))
  # Replace NAs with zeros
  tmp[is.na(tmp)] <- 0
  # Return matrix
  tmp
}

# [[1]]
#   6 7 8
# 1 1 1 1
# 2 0 0 1
# 
# [[2]]
#   2 3 4 5 6
# 2 0 1 0 0 0
# 3 1 0 1 1 1
# 4 1 0 0 0 1
# 5 0 1 0 0 1
# 6 0 1 1 1 1
# 7 0 1 1 1 0
# 
# [[3]]
#   8
# 4 1
# 5 1
# 6 1
# 7 1