寻找给定矩阵的所有子矩阵

2024-10-06 10:33:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要找到给定矩阵mxn的所有可能的子矩阵。我试图用python来做这个,但不想使用numpy。我们只能用循环来完成吗?在

例如:2x2矩阵

Matrix = [
          [1, 2], 
          [3, 4]
         ]

Submatrices =[ [1], 
               [1,2], 
               [2], 
               [3], 
               [4], 
               [3, 4], 
               [[1], [3]], 
               [[2],[4]], 
               [[1,2],[3,4]] ] 

Tags: numpy矩阵matrixmxn试图用submatrices
3条回答
def all_sub(r, c, mat): # returns all sub matrices of order r * c in mat
    arr_of_subs = []
    if (r == len(mat)) and (c == len(mat[0])):
            arr_of_subs.append(mat)
            return arr_of_subs
    for i in range(len(mat) - r + 1):
        for j in range(len(mat[0]) - c + 1):
            temp_mat = []
            for ki in range(i, r + i):
                temp_row = []
                for kj in range(j, c + j):
                    temp_row.append(mat[ki][kj])
                temp_mat.append(temp_row)
            arr_of_subs.append(temp_mat)
    return arr_of_subs

假设矩阵

Matrix = [
      [1, 2,3], 
      [3, 4,5],
      [5,6,7]
     ]

分为3个功能:

^{pr2}$

运行这个

for i in get_all_sub_mat(Matrix):
  print i

或者更简单,放在一个函数中:

def get_all_sub_mat(mat):
    rows = len(mat)
    cols = len(mat[0])
    def ContinSubSeq(lst):
        size=len(lst)
        for start in range(size):
            for end in range(start+1,size+1):
                yield (start,end)
    for start_row,end_row in ContinSubSeq(list(range(rows))):
        for start_col,end_col in ContinSubSeq(list(range(cols))):
            yield [i[start_col:end_col] for i in mat[start_row:end_row] ]

我做了一个函数,允许从矩阵中提取矩阵,我用它来提取所有可能的组合,你会找到脚本, 这个脚本解决了你的问题

def extract(mat, n, n1, m, m1): 
    l=[]
    for i in range(n-1, n1):
        r=[]
        for j in range(m-1, m1):
            if mat[i][j] != []:
                r.append(mat[i][j])
        l.append(r)
return l

# set 1 in i1 and j1 
# set dimension+1 in i2 and j2
res = []
for i1 in range(1, 3):
    for i2 in range(1,3):
        for j1 in range(1, 3):
            for j2 in range(1, 3):
                li= extract(mat, i1,i2,j1,j2)
                if li !=[] and i2 >= i1 and j2>=j1 :
                   res.append(li)

print res

相关问题 更多 >