1

私の行列は、バイナリ値を持つ 8x8 です。M の上三角行列の対角線にある連続した 3 つの 1 ie(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 に答える