Home > Blockchain >  Random Binary Matrix where Rows and Columns sum to 1 using Numpy
Random Binary Matrix where Rows and Columns sum to 1 using Numpy

Time:04-03

How can we 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]]

Tried doing the following, but failed to figure out how to shuffle the values in each column using a unique index.

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

CodePudding user response:

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

CodePudding user response:

Use np.random.permutation to create random column indices and then use advanced indexing fill indices with 1s:

N = 10
a = np.zeros((N,N), dtype=int)

a[np.arange(N), np.random.permutation(N)] = 1

a
array([[0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
       [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]])
  • Related