13

I have a square matrix A (could be any size) and I want to take the upper triangular part and place those values in an array without the values below the center diagonal (k=0).

A = array([[ 4,  0,  3],
           [ 2,  4, -2],
           [-2, -3,  7]])

using numpy.triu(A) gets me to

A = array([[ 4,  0,  3],
           [ 0,  4, -2],
           [ 0,  0,  7]])

but from here how would I copy only the upper triangular elements into a simply array? Such as:

[4, 0, 3, 4, -2, 7]

I was going to just iterate though and copy all non-zero elements, however zero's in the upper triangular are allowed.

asmeurer
  • 86,894
  • 26
  • 169
  • 240
bynx
  • 760
  • 2
  • 8
  • 19

2 Answers2

17

You can use Numpy's upper triangular indices function to extract the upper triangular of A into a flat array:

>>> A[np.triu_indices(3)]
array([ 4,  0,  3,  4, -2,  7])

And can easily convert this to a Python list:

>>> list(A[np.triu_indices(3)])
[4, 0, 3, 4, -2, 7]
mdml
  • 22,442
  • 8
  • 58
  • 66
6

transform the upper/lower triangular part of a symmetric matrix (2D array) into a 1D array and return it to the 2D format

indices = np.triu_indices_from(A)
A = np.asarray( A[indices] )
Community
  • 1
  • 1
M4rtini
  • 13,186
  • 4
  • 35
  • 42