Numpy modificar ndarray diagonal

¿Hay alguna manera en numpy para obtener una referencia a la diagonal de matriz? Quiero que mi matriz diagonal se divida por un factor determinado Gracias

Si X es tu matriz y c es el factor,

 X[np.diag_indices_from(X)] /= c 

Ver diag_indices_from en el manual de Numpy.

Una forma rápida de acceder a la diagonal de una matriz numpy cuadrada (n,n) es con arr.flat[::n+1] :

 n = 1000 c = 20 a = np.random.rand(n,n) a[np.diag_indices_from(a)] /= c # 119 microseconds a.flat[::n+1] /= c # 25.3 microseconds 

La función np.fill_diagonal es bastante rápida:

 np.fill_diagonal(a, a.diagonal() / c) 

donde a es tu matriz y c es tu factor. En mi máquina, este método fue tan rápido como el método a.flat[::n+1] /= c @ kwgoodman’s, y en mi opinión, un poco más claro (pero no tan ingenioso).

Comparando los 3 métodos anteriores:

 import numpy as np import timeit n = 1000 c = 20 a = np.random.rand(n,n) a1 = a.copy() a2 = a.copy() a3 = a.copy() t1 = np.zeros(1000) t2 = np.zeros(1000) t3 = np.zeros(1000) for i in range(1000): start = timeit.default_timer() a1[np.diag_indices_from(a1)] /= c stop = timeit.default_timer() t1[i] = start-stop start = timeit.default_timer() a2.flat[::n+1] /= c stop = timeit.default_timer() t2[i] = start-stop start = timeit.default_timer() np.fill_diagonal(a3,a3.diagonal() / c) stop = timeit.default_timer() t3[i] = start-stop print([t1.mean(), t1.std()]) print([t2.mean(), t2.std()]) print([t3.mean(), t3.std()]) [-4.5693619907979154e-05, 9.3142851395411316e-06] [-2.338075107036275e-05, 6.7119609571872443e-06] [-2.3731951987429056e-05, 8.0455946813059586e-06] 

Así que puedes ver que el método np.flat es el más rápido pero marginalmente. Cuando ejecuté esto unas cuantas veces más, hubo ocasiones en que el método fill_diagonal fue un poco más rápido. Pero la facilidad de lectura es probablemente vale la pena utilizar el método fill_diagonal.