¿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).
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.