Square Matrix in Python with values -1 or 0 or 1

Question:

I’m trying to generate a square matrix that only contains the values -1 or 0 or 1 but no other values. The matrix is used as a relationship matrix for a genetic algorithm project that I am working on. The diagonal has to be all zeros.

So far I have tried this:

import numpy as np

n = 5

M = []
for i in range(n):
   disc = random.random()
      if disc <= 0.33:
           M.append(-1)
      elif disc > 0.33 and disc <= 0.66:
           M.append(0)
      else:
           M.append(1)
                    
                    
RelMat = np.array(M).reshape(int(sqrt(n)),-1)
np.fill_diagonal(RelMat, 0)

This will yield me a matrix with all three values but it won’t allow me to make it symmetrical. I have tried to multiply it with its transpose but then the values are not correct anymore.

I have also tried to get it to work with:

import numpy as np

N = 5
b = np.random.random_integers(-1,2,size=(N,N))
b_symm = (b + b.T)/2

but this will give me 0.5 as values in the matrix which pose a problem.

My main issues is the symmetry of the matrix and the condition that the matrix has to contain all three numbers. Any help is appreciated.

Asked By: Guy

||

Answers:

numpy.triu returns the upper triangular portion of the matrix (it sets elements below the k-th diagonal to 0). You could also zero the main diagonal too in that same call (to avoid calling fill_diagonal).

After that b + b.T should give you a symmetric matrix with the desired values.

Here’s a much more compact way to build the matrix, in this case 5×5:

b = np.triu(np.random.randint(-1, 2, size=[5,5]), k=1)
b + b.T
Answered By: craigb
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.