我希望生成10,000个随机二进制矩阵,每行和每列的数量与给定的二进制矩阵相同。
矩阵为~500 x~10,000。大概有2,000,000 1s。没有零行或列。
我当前的方法将二进制矩阵转换为二分邻接矩阵,并执行1,000,000个随机边缘切换以保证随机性。对于1个矩阵,这需要13,000秒。我使用networkx的double_edge_swap函数的修改版本在python中编码。
有更有效的方法来生成这样的矩阵吗?
答案 0 :(得分: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.])
答案 1 :(得分:0)
尝试了这个,就可以了
np.mod(np.random.permutation(N*N).reshape(N,N),2)
示例:
>>> np.mod(np.random.permutation(4*4).reshape(4,4),2)
array([[0, 0, 0, 1],
[1, 1, 1, 0],
[1, 0, 0, 1],
[0, 1, 1, 0]])
>>> np.mod(np.random.permutation(4*4).reshape(4,4),2)
array([[0, 0, 0, 1],
[1, 1, 0, 0],
[1, 1, 1, 1],
[0, 0, 1, 0]])