matriz matrices diagonales python numpy indices diagonal

python - matrices - NumPy k-th índices diagonales



matrices diagonales python (4)

Utilice numpy.diag(v, k=0)

Donde k establece la ubicación diagonal desde el centro.

es decir. { k=0 : "centro predeterminado", k=(-1) : "1 fila a la izquierda del centro", k=1 : "1 fila a la derecha del centro}

Luego realice la aritmética como normalmente lo esperaría.

Echa un vistazo a los documentos aquí: np.diag() .

Ejemplos:

In [3]: np.diag(np.arange(6), k=0) Out[3]: array([[0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 0, 2, 0, 0, 0], [0, 0, 0, 3, 0, 0], [0, 0, 0, 0, 4, 0], [0, 0, 0, 0, 0, 5]]) In [4]: np.diag(np.arange(6), k=1) Out[4]: array([[0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 2, 0, 0, 0], [0, 0, 0, 0, 3, 0, 0], [0, 0, 0, 0, 0, 4, 0], [0, 0, 0, 0, 0, 0, 5], [0, 0, 0, 0, 0, 0, 0]]) In [5]: np.diag(np.arange(6), k=-1) Out[5]: array([[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0], [0, 0, 2, 0, 0, 0, 0], [0, 0, 0, 3, 0, 0, 0], [0, 0, 0, 0, 4, 0, 0], [0, 0, 0, 0, 0, 5, 0]])

Me gustaría hacer aritmética con la diagonal K-th de un numpy.array. Necesito esos índices. Por ejemplo, algo como:

>>> a = numpy.eye(2) >>> a[numpy.diag_indices(a, k=-1)] = 5 >>> a array([[ 1., 0.], [ 5., 1.]])

Desafortunadamente, diag_indices solo devuelve los índices que comprenden la diagonal principal, por lo que en este momento estoy haciendo:

a += numpy.diag([5], -1)

Pero eso no parece tan bonito ni robusto. :-)

¿Hay alguna manera, en números, de obtener índices para otra cosa que no sea la diagonal principal?


Aquí hay una manera:

  1. Crear arrays de valores de índice.
  2. Obtenga los valores de índice daigonal que desee.
  3. ¡Eso es! :)

Me gusta esto:

>>> import numpy as np >>> rows, cols = np.indices((3,3)) >>> row_vals = np.diag(rows, k=-1) >>> col_vals = np.diag(cols, k=-1) >>> z = np.zeros((3,3)) >>> z[row_vals, col_vals]=1 >>> z array([[ 0., 0., 0.], [ 1., 0., 0.], [ 0., 1., 0.]])


Los índices de la diagonal k ''th de a se pueden calcular con

def kth_diag_indices(a, k): rowidx, colidx = np.diag_indices_from(a) colidx = colidx.copy() # rowidx and colidx share the same buffer if k > 0: colidx += k else: rowidx -= k k = np.abs(k) return rowidx[:-k], colidx[:-k]

Manifestación:

>>> a array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24]]) >>> a[kth_diag_indices(a, 1)] array([ 1, 7, 13, 19]) >>> a[kth_diag_indices(a, 2)] array([ 2, 8, 14]) >>> a[kth_diag_indices(a, -1)] array([ 5, 11, 17, 23])


Un poco tarde, pero esta versión también funciona para k = 0 (y no altera las matrices, por lo que no necesita hacer una copia).

def kth_diag_indices(a, k): rows, cols = np.diag_indices_from(a) if k < 0: return rows[-k:], cols[:k] elif k > 0: return rows[:-k], cols[k:] else: return rows, cols