1

我的矩阵是一个具有二进制值的 8x8。我想在 M 的上三角矩阵的对角线上过滤掉连续三个 1 的模式,即(111)。我用 for 和 while 循环编写了一段 python 代码,但它不起作用,我无法弄清楚是什么发生在那里。请帮忙..

rf =([1,0,1,0,1,0,0,0],
     [1,0,1,0,1,0,0,0],
     [1,0,1,0,1,0,0,0],
     [1,0,1,0,1,0,0,0],
     [1,0,1,0,1,0,0,0],
     [1,0,1,0,1,0,0,0],
     [1,0,1,0,1,0,0,0],
     [1,0,1,0,1,0,0,0])

for i in range(1):
    for j in range(len (rf)-3):
        while (i<len(rf)-3 and j<len(rf)-3):
             count =0
             if rf[i,j]==True:     
               for w in range(3):
                   if rf[i+w,j+w]==True:
                      count +=1
                      print count
               if count==3:
                  i=i+3
                  j=j+3
               else:
                    rf[i,j]=False
                    i=i+1
                    j=j+1
4

1 回答 1

1

您可以使用numpy访问对角线来简化代码:

>>> import numpy as np
>>> rf = [[1,0,1,0,1,0,0,0]] * 8
>>> m = np.array(rf)
>>> m.diagonal(0)
array([1, 0, 1, 0, 1, 0, 0, 0])
>>> m.diagonal(1)
array([0, 1, 0, 1, 0, 0, 0])

查找连续位置的简单例程:

def consecutive_values(arr, val=1, cnt=3):
    def comparator(pos):
        return arr[pos] == val
    if len < cnt:
        return []
    else:
        return [p for p, x in  enumerate(arr[:1-cnt]) 
                     if all(map(comparator, xrange(p, p+cnt, 1)))]

和用法:

>>> consecutive_values([1]*5)
[0, 1, 2]

>>> consecutive_values([1]*5 + [0]*4 + [1]*3)
[0, 1, 2, 9]

>>> m = np.array([[1]*8]*8)
>>> diagonals = map(m.diagonal, range(len(m)))
>>> map(consecutive_values, diagonals)
[[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4], [0, 1, 2, 3], [0, 1, 2], [0, 1], [0], [], []]
于 2013-11-12T09:27:52.530 回答