我认为您可以先构建这样一个矩阵的一个特例,然后使用numpy.shuffle来洗牌:row_sum = 2
col_sum = 1
arr = np.zeros((5, 10))
#generate a special case, with given row_sum and col_sum
for i in range(row_sum):
arr.ravel()[i::arr.shape[1]+row_sum] = 1
arr
Out[84]:
array([[ 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 1., 1., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 1., 1., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 1., 1., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 1., 1.]])
np.random.shuffle(arr)
#np.random.shuffle(arr.T) to shuffle the columns
arr
Out[89]:
array([[ 0., 0., 0., 0., 1., 1., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 1., 1.],
[ 0., 0., 1., 1., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 1., 1., 0., 0.],
[ 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.]])
arr.sum(1) #row sums
Out[90]: array([ 2., 2., 2., 2., 2.])
arr.sum(0) #col sums
Out[91]: array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])