在二进制数组

时间:2017-01-05 23:35:07

标签: python arrays algorithm numpy graph-algorithm

假设我有一个MxN二进制矩阵。它不一定稀疏。我有兴趣找到阵列中所有直角三角形顶点的坐标。通过直角三角形,我的意思是:假设矩阵中的1或True值是三角形的顶点,并且0或False元素为空。然后,直角三角形是在视觉上形成直角三角形的排列。通过顶点我的意思是顶点对应于三角形的直角。例如。在以下5x6数组中:

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

只有一个直角三角形。它是顶点的三角形: (0,2)是顶点,(3,2)是左下角,(0,4)是右上角,其中I' m从0开始索引,从左上角开始[Python索引]。 / p>

对于给定的MxN数组,我想要一个返回子数组L的Python函数F(A),其中每个子数组是数组中右三角形顶点的坐标对。对于阵列的相同元素是多个三角形的顶点的情况,最终我只想要唯一的子阵列,但是现在该函数可以复制它们。例如,对于上面的数组A,F(A)将返回数组L = [[0,2]]

我的第一个想法是使用行和列总和。具有行总和> = 2的那些行值得探索,然后使用列> = 2。那么你需要一种有效的方法来找到交叉点。我会对使用此方法的函数或可能更好,更快的任何其他方法感兴趣。

{E.g。作为替代方案,您可以从图论的角度考虑这一点。行和列将是二分图的节点[行将是一组,列是另一组]。那么这里显示的矩阵将是完整二部图的邻接矩阵的一个象限。换句话说,它只是行集和列集之间的交叉项的一部分,因为内部集合部分都将为0,因为行节点不连接到其他行节点;仅限于列节点。从这个角度来看,直角三角形在二分图上看起来像长度为3的路径。我认为矩阵方法更简单,但我可以在这里使用任何算法。}

1 个答案:

答案 0 :(得分:1)

是的,我相信你是在考虑这个问题。生成行和列总和,并检查每个数组位置是否相交。

我没有测试过语法,但它会是这样的:

# Generate row and column sums
row_sums = (sum(A[M]) for M in range(len(A)))
col_sums = (sum([A[M, N] for M in range(len(A))] for N in range len(A[0]))

# Now, check each element in the array for being a vertex
vertices = 
    [(row, col) if A[row, col] and row_sums[row] > 1
                               and col_sums[col] > 1
          for row in range(len(A)) for col in range(len(A[0]))]

# You now have a list of all solutions, with no duplicates.