8
votes

I generated a lower triangular matrix, and I want to complete the matrix using the values in the lower triangular matrix to form a square matrix, symmetrical around the diagonal zeros.

lower_triangle = numpy.array([
[0,0,0,0],
[1,0,0,0],
[2,3,0,0],
[4,5,6,0]])

I want to generate the following complete matrix, maintaining the zero diagonal:

complete_matrix = numpy.array([
[0, 1, 2, 4],
[1, 0, 3, 5],
[2, 3, 0, 6],
[4, 5, 6, 0]])

Thanks.

2

2 Answers

10
votes

You can simply add it to its transpose:

>>> m
array([[0, 0, 0, 0],
       [1, 0, 0, 0],
       [2, 3, 0, 0],
       [4, 5, 6, 0]])
>>> m + m.T
array([[0, 1, 2, 4],
       [1, 0, 3, 5],
       [2, 3, 0, 6],
       [4, 5, 6, 0]])
7
votes

You can use the numpy.triu_indices or numpy.tril_indices:

>>> a=np.array([[0, 0, 0, 0],
...             [1, 0, 0, 0],
...             [2, 3, 0, 0],
...             [4, 5, 6, 0]])
>>> irows,icols = np.triu_indices(len(a),1)
>>> a[irows,icols]=a[icols,irows]
>>> a
array([[0, 1, 2, 4],
       [1, 0, 3, 5],
       [2, 3, 0, 6],
       [4, 5, 6, 0]])