HOWTO · NumPy

Convertir array 3D en array 2D en Python

La función reshape() del paquete NumPy se puede utilizar para convertir un array 3D en un array 2D en Python.

En esta página

Usa la operación numpy.reshape() de NumPy para convertir un array 3D en uno 2D sin alterar sus valores. Elige una forma 2D cuyas dimensiones, al multiplicarse, den el mismo número de elementos que el array de entrada. Por ejemplo, si el array tiene forma (4, 2, 2), al cambiarla a (4, 4) cada grupo del primer eje ocupa una fila y los otros dos ejes se combinan en las columnas. La agrupación adecuada depende de cómo deban interpretarse los datos.

Cómo interpretar la forma de los arrays 3D

Un array 3D de NumPy tiene tres ejes, y arr.shape indica la longitud de cada uno mediante una tupla. Los ejes no representan necesariamente profundidad, altura y anchura: su significado depende de los datos. Por ejemplo, un array de imagen puede tener ejes para la altura, la anchura y los canales de color, mientras que una simulación puede usar ejes para el tiempo, las filas y las columnas. Antes de cambiar la forma, decide qué dimensiones deben convertirse en filas y cuáles deben combinarse en columnas. El cambio de forma reorganiza los ejes, pero no modifica los valores.

Convertir un array 3D con NumPy reshape()

Llama a reshape() con una tupla que indique el número de filas y columnas deseado. Este ejemplo crea los valores del 0 al 15, los organiza en un array de forma (4, 2, 2) y agrupa cada par de ejes finales en cuatro columnas.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import numpy as np

arr = np.arange(16).reshape(4, 2, 2)
arr_2d = arr.reshape(4, 4)

print("Input shape:", arr.shape)
print("Output shape:", arr_2d.shape)
print(arr_2d)
Input shape: (4, 2, 2)
Output shape: (4, 4)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]

La forma de destino (4, 4) representa cuatro filas y cuatro columnas. NumPy conserva los valores según el orden de indexación seleccionado, de modo que las nuevas filas agrupan los valores originales de acuerdo con los ejes elegidos. Usa otra forma de destino si necesitas una agrupación distinta: no existe una única disposición 2D adecuada para todos los conjuntos de datos 3D.

Calcular la forma 2D a partir del array de entrada

Si las dimensiones pueden variar, léelas de arr.shape en lugar de fijarlas de antemano. Si la forma de entrada es (a, b, c) y cada segmento del primer eje debe convertirse en una fila, la forma de salida será (a, b * c). En el código, asigna rows, height, width = arr.shape y usa arr.reshape(rows, height * width). Así se conserva el primer eje y se combinan el segundo y el tercero. Si las filas deseadas corresponden a otro eje, primero reorganiza o transpón los ejes y luego elige una forma de salida que refleje esa interpretación.

También puedes pedirle a NumPy que deduzca una dimensión escribiendo -1, por ejemplo, con arr.reshape(arr.shape[0], -1). NumPy calcula esa dimensión a partir del número de elementos y de las demás dimensiones especificadas. Usa una sola dimensión inferida para que la forma de destino no sea ambigua.

Orden de los elementos: estilos C y Fortran

De forma predeterminada, reshape() usa el orden de indexación de estilo C. Esto significa que, al leer los valores de entrada y colocarlos en el resultado, NumPy recorre más rápido el último eje. Pasa order='F' para usar el orden de indexación de estilo Fortran, en el que varía más rápido el primer eje. El argumento order controla la secuencia de indexación que se usa para cambiar la forma; por sí solo no garantiza una disposición física concreta en memoria. En la mayoría de las conversiones basta con el valor predeterminado. Elige el orden Fortran solo si la secuencia de valores del resultado debe seguir esa convención.

Compatibilidad de formas y errores frecuentes

El producto de las dimensiones de entrada debe ser igual al producto de las dimensiones de salida solicitadas. Un array de entrada con forma (4, 2, 2) tiene 16 elementos, por lo que (4, 4) o (2, 8) pueden contener los mismos valores, pero (4, 5) no. Si la forma solicitada implica un número incompatible de elementos, NumPy genera ValueError. Para diagnosticar este error, comprueba arr.size o calcula los productos de las dimensiones. Comprueba también que la agrupación elegida para las filas y columnas corresponda al significado de los datos: una forma puede ser matemáticamente compatible y, aun así, organizar los valores de una manera que no sirva para la siguiente operación.

Consulta los parámetros y el comportamiento de la función en la referencia oficial de la API reshape de NumPy.