在python中查找矩阵行中的更改

时间:2017-05-19 16:01:37

标签: python loops matrix

我有一个以0s和1s编码的NxM矩阵 - 其中只有1s在各自的位置打印,而0是空格,如下面的矩阵:

 m = [[0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0]
      [0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0]
      [0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0]
      [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0]
      [1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1]

我的问题是如何创建一个起点,从0到1发生的变化,以及从每行中从1变为0的变化的结束点。然后打印起点和终点之间的所有1

我有以下代码(不起作用):

nrows, ncols = m.shape #gets the shape of the matrix
for r in range(nrows):
  for c in range(ncols):
    if m[r,c] == 0 and m[r,c+1] == 1: #checks if there is a 0 first and then a 1 in the next index of the column in the row to create a starting point
       start = m[r,c+1]
    if m[r,c] == 1 and m[r,c+1] == 0: #checks if there is a 1 first and then a 0 in the next index of the column in the row to create an end point
       end = m[r, c+1]

我想要的输出是,例如考虑到拉斯特罗:

  

它应该在该行中找到0之前打印前1和后1之间的所有内容,不包括0。   所以基本上这个:1 1 1 1 .... 1 1 1 1 1 1 .... 1 1   点(。)表示必须排除的0   所有帮助和建议都将受到高度赞赏。

3 个答案:

答案 0 :(得分:1)

您的目标是打印输出还是您的目标是指示1开始和结束位置的标记?如果您的目标只是打印输出,为什么不能简单地说:

m = [[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
     [1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1]
]

for row in m:
    for bit in row:
        print(bit or ' ', end=' ')
    print()

输出

              1 1 1 1                   
              1 1 1 1                   
          1 1 1 1                       
          1 1 1 1                       
                            1 1 1 1     
                            1 1 1 1     
1 1 1 1         1 1 1 1 1 1         1 1 

在您认为合适时操纵消除1(即' '空间与''空字符串之间的零或空格的空格。)

  

你介意展示/解释我如何获得标记   1开始和结束的地方?

借助于Identify groups of continuous numbers in a list的SO回答,我们可以做到:

for row in m:
    indicies = compress(count(), row)

    ranges = []

    for _, g in groupby(enumerate(indicies), lambda x: x[0] - x[1]):
        group = [x[1] for x in g]
        ranges.append((group[0], group[-1]))

    print(ranges)

输出

[(7, 10)]
[(7, 10)]
[(5, 8)]
[(5, 8)]
[(14, 17)]
[(14, 17)]
[(0, 3), (8, 13), (18, 19)]

答案 1 :(得分:0)

你尚未获得可行的MCVE;我将其转换为Python并提出了解决方案。

取每行,将其向左移一个位置,然后从原始行中减去。这将标记所有转换为1和-1。然后你只需要找到第一个0 => 1的变化,然后在那之后改变1 => 0。根据需要调整指数。

注意:我保持这种低技术含量。如果将列表转换为位图,找到具有XOR的转换,并且注意标记起始值(如果它从1开始,则需要第2和第3个转换),可以大大缩短解决方案,而不是前两个。)

<form ng-if="!loggedIn">
    <input type="text" placeholder="Username" ng-model="$parent.username">
    <input type="password" placeholder="Password" ng-model="$parent.password">
    <button type="submit" data-ng-click="login()">Login</button>
</form>

输出:

m = [[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
     [1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1]
]

for row in range(len(m)):
    line = m[row]
    first = line[:-1]
    shift = line[1:]

    diff = [first[i] - shift[i] for i in range(len(first))]
    l_bound = diff.index(-1) + 1
    r_bound = diff[l_bound:].index(1) + l_bound
    print
    print row, '\t', line
    print '\t', diff
    print '\t', l_bound, r_bound

答案 2 :(得分:0)

这是将连续差异变为新数组的直接方法。

coded = np.append(m[:,:1]*2-1, m[:,1:] - m[:,:-1], axis=1)
# [[-1  0  0  0  0  0  0  1  0  0  0 -1  0  0  0  0  0  0  0  0]
#  [-1  0  0  0  0  0  0  1  0  0  0 -1  0  0  0  0  0  0  0  0]
#  [-1  0  0  0  0  1  0  0  0 -1  0  0  0  0  0  0  0  0  0  0]
#  [-1  0  0  0  0  1  0  0  0 -1  0  0  0  0  0  0  0  0  0  0]
#  [-1  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0 -1  0]
#  [-1  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0 -1  0]
#  [ 1  0  0  0 -1  0  0  0  1  0  0  0  0  0 -1  0  0  0  1  0]]

在此数组中,-1表示0的狂欢的开始,1表示1的狂欢的开始。我不清楚你要做什么,但也许这会有所帮助。