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



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

  1. 每个条目都是0或1
  2. 每行总和为1
  3. 每列至少包含一个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)]
    
  2. 从列表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=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)

相关内容

  • 没有找到相关文章

最新更新