生成随机二进制矩阵

Jon*_* Lu 7 python random matrix

我希望生成10,000个随机二进制矩阵,其每行和每列具有与给定二进制矩阵相同数量的1.

矩阵约为500×10,000.大概有2,000,000 1s.没有零行或列.

我当前的方法将二进制矩阵转换为二分邻接矩阵,并执行1,000,000个随机边缘切换以保证随机性.对于1个矩阵,这需要13,000秒.我在python中编码,使用networkx的double_edge_swap函数的修改版本.

有没有更有效的方法来生成这样的矩阵?

CT *_*Zhu 2

我认为你可以首先构建这样一个矩阵的特殊情况,然后使用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.])
Run Code Online (Sandbox Code Playgroud)

  • 如果行是 [6, 5, 6, 4, 6, 7, 4, 5, 4, 4] 列是 [ 3, 6, 5, 7, 2, 8, 3, 3, 4, 10 ] 而不是常数?即使您有一种解决方案,简单的洗牌也并不总是会产生其他解决方案。 (2认同)