¿Hay algún modo en numpy para obtener una referencia a la matriz diagonal? Quiero que mi matriz diagonal al ser dividido por un cierto factor GraciasNumpy modify ndarray diagonal
10
A
Respuesta
16
Si X
es su matriz y c
es el factor,
X[np.diag_indices_from(X)] /= c
Ver diag_indices_from
en el manual Numpy.
14
Una forma rápida de acceder a la diagonal de una matriz numpy cuadrado (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
4
La función np.fill_diagonal
es bastante rápido:
np.fill_diagonal(a, a.diagonal()/c)
donde a
es su matriz y c
es tu factor En mi máquina, este método era tan rápido como el método a.flat[::n+1] /= c
de @ kwgoodman, y en mi opinión un poco más claro (pero no tan resbaladizo).
3
La comparación de las anteriores 3 métodos:
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í se puede ver que el método np.flat
es el más rápido pero de forma marginal. Cuando ejecuté esto unas cuantas veces más, hubo ocasiones en que el método fill_diagonal
fue ligeramente más rápido. Pero en cuanto a la legibilidad, probablemente valga la pena utilizar el método fill_diagonal.
Cuestiones relacionadas
- 1. Subclase numpy ndarray problema
- 2. Numpy NdArray Memoization
- 3. Numpy modify array in place?
- 4. Operador ternario para NumPy ndarray?
- 5. ¿Cuánta memoria usa numpy ndarray?
- 6. cambiando los valores de la diagonal de una matriz en numpy
- 7. ¿Cómo encontrar los valores más frecuentes en numpy ndarray?
- 8. Agregue nombres de columnas mediante programación a numpy ndarray
- 9. usando numpy en cython: definiendo ndarray datatype/ndims
- 10. Obtener los nombres de columna de un ndarray pitón numpy
- 11. Ordenar una matriz numpy en función de su diagonal
- 12. Programmatically modify Ensamblado Encuadernación
- 13. Seleccionar filas de un ndar ndar ndarray
- 14. ¿Puedo forzar a un ndarray numpy a tomar posesión de su memoria?
- 15. cómo transformar un cvMat OpenCV de nuevo a ndarray en numpy
- 16. matriz numpy inmutable?
- 17. asp .net mvc OnResultExecuting modify filterContext Resultado
- 18. numpy: ndenumerate para matrices enmascaradas?
- 19. ¿Hay una función de "cuadro delimitador" (división con valores distintos de cero) para un ndarray en NumPy?
- 20. Mantener una subclase ndarray numpy como el valor de retorno durante una transformación. ¿Es seguro establecer __array_priority__?
- 21. manera eficiente para crear una matriz dispersa en diagonal
- 22. "DateTime-> modify ('+ 0 days')" Modifica el objeto DateTime
- 23. Escapar barra diagonal en Jackson
- 24. expresión regular y barra diagonal
- 25. ¿Cómo "insertar" una pequeña matriz numpy en un bloque predefinido de una matriz numpy grande?
- 26. ¿Qué significa matriz ** 2 en python/numpy?
- 27. numpy: invertir una matriz triangular superior
- 28. Normalizar numpy matrices diferentes "imagen" de los objetos
- 29. ¿Cómo reemplazar la barra diagonal inversa con doble barra diagonal inversa?
- 30. Por favor, enséñame una buena mnemotécnica para recordar "barra diagonal" vs. "barra diagonal inversa"