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