Search code examples
pythonnumpymatrixsparse-matrix

Random Binary Matrix where Rows and Columns Sum to 1 using Numpy


I want to generate a random n x n binary matrix using NumPy, where:

  • each value is either 0 or 1
  • every row sums up to 1
  • every column sums up to 1

For example, a valid matrix might be

[[1 0 0]
[0 0 1]
[0 1 0]]

while an invalid one is

[[1 0 0]
[0 0 1]
[0 0 1]]

I tried doing the following, but I couldn't figure out how to shuffle the values in each column using a unique index. How do I generate a matrix that adheres to the above constraints?

N = 10
a = np.zeros((N,N))
a[0,:] = 1

Solution

  • Create an n by n identity matrix, and then shuffle all of the rows. The identity matrix is a binary matrix where each row and column sums to one, and shuffling the rows preserves this property:

    n = 5
    result = np.identity(n)
    np.random.shuffle(result)
    print(result)
    

    This will output something like:

    [[0. 1. 0. 0. 0.]
     [0. 0. 0. 0. 1.]
     [0. 0. 0. 1. 0.]
     [1. 0. 0. 0. 0.]
     [0. 0. 1. 0. 0.]]