Créalo o no, después de perfilar mi código actual, la operación repetitiva de la reversión de matriz numpy se comió una gran parte del tiempo de ejecución. Lo que tengo ahora es el método común basado en la vista:
reversed_arr = arr[::-1]
¿Hay alguna otra manera de hacerlo de manera más eficiente, o es solo una ilusión de mi obsesión con el rendimiento poco realista?
arr[::-1]
solo devuelve una vista invertida. Es lo más rápido que puede obtener y no depende de la cantidad de elementos en la matriz, ya que solo cambia los pasos. ¿Lo que estás invirtiendo es realmente una matriz numpy?arr
es una matriz numpy.f2py
¡es tu amigo! A menudo vale la pena escribir partes críticas del rendimiento de un algoritmo (especialmente en informática científica) en otro idioma y llamarlo desde python. ¡Buena suerte!arr[::-1]
: github.com/numpy/numpy/blob/master/numpy/lib/twodim_base.py . Buscardef flipud
. La función tiene literalmente cuatro líneas de largo.Respuestas:
Cuando crea
reversed_arr
, está creando una vista en la matriz original. Luego puede cambiar la matriz original y la vista se actualizará para reflejar los cambios.¿Vuelve a crear la vista con más frecuencia de la que necesita? Deberías poder hacer algo como esto:
No soy un experto numpy, pero parece que sería la forma más rápida de hacer las cosas en numpy. Si esto es lo que ya está haciendo, no creo que pueda mejorarlo.
PD Gran discusión de puntos de vista numpy aquí:
Ver en una matriz numpy?
fuente
look_at
supone que debe hacer la función?reversed_arr
todavía es utilizable después de que se modificaron los datos subyacentes. Escribir nuevos valores en la matriz no invalida la vista. En realidad, también podría usar la vista para escribir nuevos valores en la matriz.reversed_arr[0] = 99
establecería el último elemento de la matriz en 99, igual que loarr[-1] = 99
haría.Como se mencionó anteriormente, en
a[::-1]
realidad solo crea una vista, por lo que es una operación de tiempo constante (y como tal no toma más tiempo a medida que la matriz crece). Si necesita que la matriz sea contigua (por ejemplo, porque está realizando muchas operaciones vectoriales con ella),ascontiguousarray
es casi tan rápido comoflipup
/fliplr
:Código para generar la trama:
fuente
Porque esto parece no estar marcado como respondido aún ... La respuesta de Thomas Arildsen debería ser la correcta: solo use
si es una matriz 1d (matriz de columnas).
Con matrices hacer
si desea invertir las filas y
flipud(matrix)
si desea voltear las columnas. No es necesario hacer que su matriz de columnas 1d sea una matriz de filas bidimensional (matriz con una capa None) y luego voltearla.fuente
np.fliplr()
Voltea la matriz de izquierda a derecha.Tenga en cuenta que para las matrices 1d, debe engañarlo un poco:
fuente
reversed_arr = np.flipud(arr1d)
Parece funcionar directamente.Ampliaré la respuesta anterior sobre
np.fliplr()
. Aquí hay un código que demuestra la construcción de una matriz 1d, transformándola en una matriz 2d, volteándola y luego convirtiéndola nuevamente en una matriz 1d.time.clock()
se usará para mantener el tiempo, que se presenta en términos de segundos.Con la declaración de impresión sin comentar:
Con la declaración impresa comentada:
Entonces, en términos de eficiencia, creo que es decente. Para aquellos de ustedes que aman hacerlo en una línea, aquí está esa forma.
fuente
Ampliando lo que otros han dicho, daré un breve ejemplo.
Si tienes una matriz 1D ...
Pero si está trabajando con una matriz 2D ...
Esto en realidad no revierte la Matriz.
Debería usar np.flip para invertir los elementos
Si desea imprimir los elementos de una matriz uno por uno, use plano junto con flip
fuente
Para que funcione con números negativos y una larga lista, puede hacer lo siguiente:
Donde flipud es para 1d arra
fuente