检查矩阵元素是否连续

时间:2015-04-05 18:25:32

标签: python list matrix

我一直在努力解决这个问题,但我无法解决这个问题。

我需要检查矩阵中的元素是否连续。例如:

1 0 1 0 0 0
0 1 0 0 1 0
0 0 1 1 0 0

在这种情况下,1是连接的,因为它们是连续的。

检查此示例:

1 0 0 0 1
0 1 0 0 1
1 0 0 0 1
0 0 1 0 0

在这种情况下,1不连续,因为它们没有连接。 如您所见,矩阵大小各不相同。

2 个答案:

答案 0 :(得分:1)

一些递归就可以解决问题。

以下是算法的说明:

  1. 找到1
  2. 将其标记为0
  3. 移动到所有相邻的单元格
  4. 1的所有相邻单元格中,从第2点开始重复。
  5. 当无处可去时,再次找到1 - 如果找到则矩阵未连接
  6. 澄清最后一点 - 如果矩阵中剩余1,则表示我们的算法没有达到它。由于它只移动到相邻的单元格,因此我们得出结论,剩余的1未与步骤1中的初始1相关联。

    以下是代码:

    def find_a_1():
        for row_i, row in enumerate(matrix):
            if '1' in row:
                return {
                    'row': row_i,
                    'col': row.index('1'),
                }
    
    def walk_the_matrix(point):
        """ Clear current point and move to adjacent cells that are "1s" """
        # check if this is a valid cell to work on:
        try:
            if point['row'] < 0 or point['col'] < 0:
                raise IndexError  # prevent negative indexes
            if matrix[point['row']][point['col']] == '0':
                return  # nothing to do here, terminate this recursion branch
        except IndexError:
            return  # we're outside of the matrix, terminate this recursion branch
        # clear this cell:
        matrix[point['row']][point['col']] = '0'
        # recurse to all 8 directions:
        for i in (-1, 0, 1):
            for j in (-1, 0, 1):
                if (i, j) == (0, 0):
                    continue
                walk_the_matrix({
                    'row': point['row'] + i,
                    'col': point['col'] + j,
                });
    

    示例:

    matrix = [
        list('001001'),
        list('010000'),
        list('001110'),
        list('110000'),
    ]
    
    starting_point = find_a_1()
    
    walk_the_matrix(starting_point)
    
    if find_1() is None:
        print("The matrix is connected")
    else:
        print("The matrix is not connected")
    

    请注意,这会改变matrix列表。

答案 1 :(得分:1)

编辑,因为我误读了原始问题

问题似乎归结为“有没有1完全被0包围?”。

假设my_array由0和1组成,我可以使用2D卷积计算每个单元周围> 1的单元格数量的简洁方法。

import numpy as np
import scipy.signal as ss

kernel = np.ones((3,3))

count = ss.convolve2d(my_array, kernel, mode='same') # Count number of 1s around each cell
contig = my_array * count # Remove counts where the 'centre cell' is zero

要检查my_array是否有任何孤立的1,只需检查contig中的任何1:

test_contig = sum(contig[contig==1]) > 0