Aquí es otra buena manera de hacer esto.. Si quieres una vista unidimensional de uso diagonal principal de la matriz:
A.ravel()[:A.shape[1]**2:A.shape[1]+1]
Para el uso superdiagonal i'th:
A.ravel()[i:max(0,A.shape[1]-i)*A.shape[1]:A.shape[1]+1]
Para el uso subdiagonal i'th:
A.ravel()[A.shape[1]*i:A.shape[1]*(i+A.shape[1]):A.shape[1]+1]
O en general, para la diagonal i donde la diagonal principal es 0, las subdiagonales son negativas y las superdiagonales son positivas, use:
A.ravel()[max(i,-A.shape[1]*i):max(0,(A.shape[1]-i))*A.shape[1]:A.shape[1]+1]
Estos son vistas y no copias, por lo que se ejecutarán más rápido para la extracción de una diagonal, pero los cambios realizados en el nuevo objeto de matriz se aplicará a la matriz original. En mi máquina, estos funcionan más rápido que la función fill_diagonal al establecer la diagonal principal en una constante, pero puede no ser siempre el caso. También se pueden usar para asignar una matriz de valores a una diagonal en lugar de solo una constante.
Notas: para matrices pequeñas, puede ser más rápido utilizar el atributo flat
de la matriz NumPy. Si la velocidad es un problema importante, podría valer la pena hacer que A.shape[1]
sea una variable local. Además, si la matriz no es contigua, ravel()
devolverá una copia, por lo tanto, para asignar valores a una división con franjas, será necesario dividir creativamente la matriz original utilizada para generar la sección con franjas (si es contigua) o para usar el atributo flat
.
Además, originalmente se planeó que en NumPy 1.10 y posteriormente el método 'diagonal' de matrices devolverá una vista en lugar de una copia. Ese cambio aún no se ha realizado, pero espero que en algún momento este truco para obtener una vista ya no sea necesario. Ver http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.diagonal.html
¿Qué versión de numpy estás utilizando? 'np.diag_indices_from' fue agregado en v1.4 – JoshAdel
sí, tienes razón, actualmente estoy usando python v 1.3.0 – pacodelumberg
@LangerHansIslands Espero que te refieras numpy 1.3, no python 1.3 (que salió a mediados de los años noventa). .: p) – Dougal