Introducción al análisis de datos en Python con Numpy

Arrays de >=3 dimensiones

Hasta ahora hemos trabajado los arrays de 1 y 2 dimensiones, así que la pregunta es... ¿Será posible hacer lo mismo con 3 o más dimensiones? Pues sí. ¿Pero cómo se hace?

Creación básica

De la misma forma que un array de 2 dimensiones, el truco para crear uno de 3 consiste en anidar listas a 3 niveles de profundidad.

Para entender bien el proceso vamos a recrear los 3 niveles de profundidad paso a paso para un array muy simple de 2x2x2

# %%
import numpy as np

# Primer nivel, 2 elementos en ancho
arr_1d = np.array(
    [1, 2]
)
arr_1d

# Segundo nivel, 2 elementos en ancho por 2 de alto,
# 4 elementos en total
arr_2d = np.array([
    [1, 2], 
    [3, 4]
])
arr_2d

# Tercer nivel, 2 elementos en ancho por 2 de alto 
# por 2 de profundidad, 8 elementos en total
arr_3d = np.array([
    [
        [1, 2], 
        [3, 4]
    ], 
    [
        [5, 6], 
        [7, 8]
    ]
])
arr_3d

Con esto tenemos las 3 dimensiones, pero podemos añadir más.

El concepto es difícil de imaginar, ya que nosotros únicamente percibimos 3 dimensiones, pero si lo entendemos como una ramificación en dónde por cada elemento ahora hay otra lista con dos elementos, entonces no es tan imposible hacernos una idea:

# Cuarto nivel, 2 elementos en ancho por 2 de alto 
# por 2 de profundidad por 2 más, 16 en total
arr_4d = np.array([
    [
        [
            [1, 2], 
            [3, 4]
        ], 
        [
            [5, 6], 
            [7, 8]
        ]
    ], 
    [
        [
            [9, 10], 
            [11, 12]
        ], 
        [
            [13, 14],
            [15, 16]
        ]
    ]
])
arr_4d

Creación pre-generada de ceros y unos

Evidentemente no siempre vamos a querar crear nuestros arrays de 3 o más dimensiones a mano. También podemos crearlos con las funciones de pre-generación que vimos en la lección 2.

# Array 3d de ceros 2x2x2
arr_3d = np.zeros([2,2,2])
arr_3d

# Array 4d de unos 2x2x2x2
arr_4d = np.ones([2,2,2,2])
arr_4d

Creación con reshape

Reshape es una función que sirve para reformar las dimensiones y sus tamaños.

Por ejemplo podemos reformar una matriz de 3x3 a partir de un rango de 9 elementos:

arr_2d = np.arange(9).reshape(3,3)
arr_2d 

Evidentemente tenemos que seguir un patrón lógico, y es que el número de elementos tiene que concordar con el tamaño de las dimensiones multiplicadas.

# Esto no funcionará: 9 != 3x3x3
arr_3d = np.arange(9).reshape(3,3,3)
arr_3d 

# Esto sí que funcionará: 27 == 3x3x3
arr_3d = np.arange(27).reshape(3,3,3)
arr_3d