Python 生成所有列和为正的行随机0-1矩阵的最佳方法?

Python 生成所有列和为正的行随机0-1矩阵的最佳方法?,python,arrays,linear-algebra,Python,Arrays,Linear Algebra,我试图高效地生成所有9×3矩阵的列表,其中每个矩阵满足以下属性: 每个条目都是0或1 每行和为1 每列至少包含一个1 我的第一个方法如下: 生成大小为9×3的所有0-1矩阵的列表a import numpy as np import itertools n=9 k=3 A=[np.reshape(np.array(i), (n,k)) for i in itertools.product([0, 1], repeat = n*k)] 从列表A中提取行和为1且列至少包含一个正条目的值

我试图高效地生成所有9×3矩阵的列表,其中每个矩阵满足以下属性:

  • 每个条目都是0或1
  • 每行和为1
  • 每列至少包含一个1
  • 我的第一个方法如下:

  • 生成大小为9×3的所有0-1矩阵的列表a

     import numpy as np
     import itertools
     n=9
     k=3
     A=[np.reshape(np.array(i), (n,k)) for i in itertools.product([0, 1], repeat = n*k)]
    
  • 从列表A中提取行和为1且列至少包含一个正条目的值:

     matrix_list=[]
     N=len(A)
     for k in range(N):
         B=A[k]
         if (np.sum(B,axis=0)>1).all() and (np.sum(B,axis=1)==1).all():
             matrix_list.append(B)
    
  • 我相信这种方法是有效的,但效率很低。我是否可以通过考虑如何生成所有可能的矩阵来创建我的矩阵列表,这些矩阵是从简单矩阵S中得到的:

        S=np.matrix([[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0]])
    

    并创建所有可能的矩阵,这些矩阵由每行中的置换条目产生,但不包括列和(无论是第0列还是第1列)为零的两个矩阵?

    一位不关注我的问题的朋友建议这样做,这很有效:

        from itertools import combinations
        matrices=[]
        nine=set(range(9))
        for i in range(1,9):
            for combinationI in combinations(nine,i):
                m=[0]*9
                for cI in combinationI:
                    m[cI]=[1,0,0]
                remaining=nine.difference(combinationI)
                for j in range(1,9-i):
                    for combinationJ in combinations(remaining,j):
                        matrix=m[:]
                        for cJ in combinationJ:
                            matrix[cJ]=[0,1,0]
                        r=remaining.difference(set(combinationJ))
                        for cR in r:
                            matrix[cR]=[0,0,1]
                        matrices.append(matrix)