سؤال

I would like call a function on each entry of an upper-triangular matrix. In order to avoid a messy nest of for loops, I am using the numpy.triu_indices function. My function works but I would like to know if there is a cleaner way to implement the indexing.

import numpy as np
def weighted_edges(adjmat):
    indices = np.triu_indices(len(adjmat))
    return ((x, y, adjmat[x,y]) for (x,y) in zip(indices[0], indices[1]))

I suspect that there is a way to implement this without needing to reference indices[i] in the zip call. Is there indeed a way to do so?

هل كانت مفيدة؟

المحلول

If you have an N x N matrix from which you want the upper triangular values, just do

import numpy as np
N = 5
x = np.arange(N**2).reshape(N, N)
upper = x[np.triu_indices(N, 0)]

If you want the triangular values offset from the main diagonal by k columns, then do

upper = x[np.triu_indices(N, k)]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top