NumPy: Convertir matrices de NumPy en vectores

Publicado el 13 julio 2021 por Daniel Rodríguez @analyticslane

Existen diferentes opciones para transformar las matrices de NumPy en vectores: el método flatten() o la función ravel(). Veamos a continuación la forma de trabajar con ambos.

El método flatten()

En los objetos ndarray de NumPy existe el método flatten() con el cual se puede aplacar el contenido de los objetos, es decir, convertir una matriz de cualquier dimensión en una matriz numérica 1D plana. Método que tiene la siguiente forma:

ndarray.flatten(order='C')

donde el parámetro order admite alguno de los siguientes valores:

  • 'C': lee los elementos de la matriz por filas, esto es, genera un resultado similar al que obtendremos en C.
  • 'F': lee los elementos de la matriz por columnas, esto es, genera un resultado similar al que obtendremos en Fortran.
  • 'A': lee los elementos de la matriz según el orden que se encuentre en memoria.

El resultado que devuelve el método es una copia del objeto original, por lo que se puede modificar sin afectar al original.

Ejemplo de uso de flatten() para transformar matrices de NumPy en vectores

Una vez vista la forma del método se puede ver cómo funciona este, para lo que se creará una simple matriz a partir de una lista de Python. Una vez hecho esto se puede comparar el resultado que se obtiene al ordenar por filas (valor por defecto), por columnas o en base a la posición en memoria de los elementos.

import numpy as np

arr = np.array([[1, 2, 3],
                [4, 5, 6],
                [7, 8 ,9]])

print('Por filas   ', arr.flatten())
print('Por columnas', arr.flatten(order='F'))
print('Por memoria ', arr.flatten(order='A'))
Por filas    [1 2 3 4 5 6 7 8 9]
Por columnas [1 4 7 2 5 8 3 6 9]
Por memoria  [1 2 3 4 5 6 7 8 9]

En los dos primeros ejemplos se puede ver el resultado esperado, los valores se leen por filas o columnas. Por otro lado, cuando se selecciona la opción "A" parecer que el resultado es el mismo que al ordenar por filas, pero no es así. Esto se puede comprobar simplemente transponiendo la matriz y comprobando los resultados.

print('Por filas   ', arr.T.flatten())
print('Por columnas', arr.T.flatten(order='F'))
print('Por memoria ', arr.T.flatten(order='A'))
Por filas    [1 4 7 2 5 8 3 6 9]
Por columnas [1 2 3 4 5 6 7 8 9]
Por memoria  [1 2 3 4 5 6 7 8 9]

Observamos que los resultados por filas y columnas se han intercambiado, como esperaríamos, pero al leer por la posición en memoria no. Esto es así porque al transponer los elementos no cambia la posición de estos en memoria, simplemente se reordenan. Por eso, en caso de que el orden de los elementos del vector es importante la mejor opción es usar las opciones 'C' o 'F'.

La función ravel()

Una alternativa al método flatten() es la función ravel(). Al ser una función es necesario pasarle como primer parámetro el objeto a transformar, el cual puede ser también una lista de listas, y como segundo el orden, con las mismas opciones que flatten(). Así esta función tiene la siguiente forma

np.ravel(arr, order='C')

Ejemplo de uso de ravel() para transformar matrices de NumPy en vectores

La única diferencia entre ravel() y flatten() es que el primero es una función, por no se le debe pasar el objeto a procesar. Así para aplanar la matriz del ejemplo anterior solamente se tiene que escribir.

np.ravel(arr)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

Al ser una función también se puede utilizar sobre otros objetos que se puedan transformar en un objeto ndarray, por ejemplo, sobre una lista de listas.

np.ravel([[1, 2, 3], [4, 5, 6], [7, 8 ,9]], order='F')
array([1, 4, 7, 2, 5, 8, 3, 6, 9])

Conclusiones

En esta entrada se ha visto cómo se puede usar el método flatten() o la función ravel() para convertir matrices de NumPy en vectores. Siendo ambas opciones similares.