我试图有效地生成所有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=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)