Python 生成随机二元矩阵

Python 生成随机二元矩阵,python,matrix,random,Python,Matrix,Random,我希望生成10000个随机二进制矩阵,这些矩阵每行和每列的1s数与给定二进制矩阵的1s数相同 矩阵为~500 x ~10000。大约有200万个1。没有零行或零列 我当前的方法将二进制矩阵转换为二分邻接矩阵,并执行1000000次随机边缘切换以保证随机性。1个矩阵需要13000秒。我用python编写代码,使用networkx的double_edge_swap函数的修改版本 有没有更有效的方法来生成这样的矩阵?我认为您可以先构建这样一个矩阵的特例,然后使用numpy.shuffle对其进行洗牌:

我希望生成10000个随机二进制矩阵,这些矩阵每行和每列的1s数与给定二进制矩阵的1s数相同

矩阵为~500 x ~10000。大约有200万个1。没有零行或零列

我当前的方法将二进制矩阵转换为二分邻接矩阵,并执行1000000次随机边缘切换以保证随机性。1个矩阵需要13000秒。我用python编写代码,使用networkx的double_edge_swap函数的修改版本


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

我认为您可以先构建这样一个矩阵的特例,然后使用
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.])

试过这个,效果很好

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]])

如果可能的话,我也会建议你稍微懒一点。我们只需定义一个行号列表(示例中为
[2,4,1,3,0]
)并在需要完成赋值的情况下使用全尺寸
np.array
,或者使用某种更改历史(但我不确定
numpy
是否可以使用动态大小的数组),就可以生成一个新的矩阵.Dynamic
numpy
array可能不起作用,这是以前讨论过的。我想对于动态数组来说,
Fortran
C
可能是最好的选择。但是,等等,这不再是一个懒惰的解决方案:)如果行是[6,5,6,4,6,7,4,5,4,4],列是[3,6,5,7,2,8,3,3,4,10],而不是常量呢?即使你有一个解决方案,简单的洗牌也不会产生其他的解决方案。我正在寻找这个问题的名称。这是“处理从其水平和垂直线和重建二值图像”以及二维(成对非平行晶格方向)情况下的主要问题,问题在P中。了解什么需要10000个随机选择的可能重建是很有趣的。您应该指定是否需要特定的分布,因为不同的方法可能会给出稍有不同的分布。这取决于您是否只想提高生成矩阵的效率。好的解决方案称为c(用于从python生成矩阵的函数。