To extract the upper triangle values to a flat vector,
you can do something like the following:
import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a)
#array([[1, 2, 3],
# [4, 5, 6],
# [7, 8, 9]])
a[np.triu_indices(3)]
#or
list(a[np.triu_indices(3)])
#array([1, 2, 3, 5, 6, 9])
Similarly, for the lower triangle, use np.tril
.
IMPORTANT
If you want to extract the values that are above the diagonal (or below) then use the k argument. This is usually used when the matrix is symmetric.
import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
#array([[1, 2, 3],
# [4, 5, 6],
# [7, 8, 9]])
a[np.triu_indices(3, k = 1)]
# this returns the following
array([2, 3, 6])
EDIT (on 11.11.2019):
To put back the extracted vector into a 2D symmetric array, one can follow my answer here: https://stackoverflow.com/a/58806626/5025009