Arreglos Multidimensionales
En el capítulo anterior vimos arreglos de una sola dimensión. Sin embargo, podemos crear arreglos de varias dimensiones, similar a como podemos crear listas de Python que contienen otras listas internamente. Por ejemplo, creemos un arreglo de dos dimensiones (2-D):
1
arr = np.array([
2
[1, 2],
3
[3, 4]
4
])
5
6
# También se puede en una sola línea, aunque no es tan legible
7
# arr = np.array([[1, 2], [3, 4]])
Copied!

Conociendo la forma de un arreglo

En el capítulo anterior vimos el atributo size para conocer el número de elementos de un arreglo. Este método sigue aplicando para arreglos multidimensionales:
1
arr = np.array([
2
[1, 2],
3
[3, 4]
4
])
5
6
arr.size # 4
Copied!
Sin embargo, a veces es útil también saber la forma de un arreglo, es decir, la longitud de cada una de las dimensiones. Para esto podemos utilizar el atributo shape:
1
arr.shape # (2, 2)
Copied!

Creando arreglos multidimensionales

En el capítulo anterior vimos cómo crear arreglos utilizando métodos como arange, ones y zeros, entre otros. Algunos de estos métodos reciben la forma del arreglo como primer argumento:
1
np.ones((2, 2)) # [[1.,1.], [1.,1.]]
2
np.zeros((2, 2, 2)) # un arreglo de tres dimensiones (un cubo): 2 x 2 x 2
3
4
np.full((3, 3, 8), 5) # un arreglo de tres dimensiones (un cubo): 3 x 3 x 8
Copied!
Otros métodos como arange no permiten especificar la forma del arreglo final. Sin embargo, podemos cambiar la forma de un arreglo como veremos a continuación.

Cambiando la forma de un arreglo

Para cambiar la forma de un arreglo utilizamos el método reshape. Por ejemplo, aunque el método arange no permite especificar la forma, podemos cambiar la forma con reshape:
1
arr = np.arange(6) # [0, 1, 2, 3, 4, 5]
2
arr.reshape((3, 2))
3
# [[0, 1],
4
# [2, 3],
5
# [4, 5]]
6
7
# o en una sola línea
8
# np.arange(6).reshape((3, 2))
Copied!

Obteniendo valores de un arreglo multidimensional

Para obtener los valores de un arreglo multidimensional debemos especificar los índices en cada dimensión. Por ejemplo, para obtener un valor en un arreglo de dos dimensiones debemos pasar dos índices:
1
arr = np.array([
2
[1, 2],
3
[3, 4]
4
])
5
arr[0, 0] # 1
6
arr[0, 1] # 2
7
arr[1, 0] # 3
8
arr[1, 1] # 4
Copied!
Para un arreglo de tres dimensiones pasaríamos tres índices, y así sucesivamente.
Si queremos seleccionar la columna entera pasamos dos puntos (:) como primer índice:
1
arr[:,0] # [1, 3]
Copied!
Si queremos seleccionar la fila entera pasamos dos puntos (:) como segundo índice:
1
arr[1,:] # [3, 4]
Copied!
Podemos incluso seleccionar rangos dentro de las filas y las columnas:
1
arr = np.array([
2
[1, 2, 3],
3
[4, 5, 6],
4
[7, 8, 9]
5
])
6
7
arr[1:, :2] # [[4, 5], [7, 8]]
Copied!

Multiplicando arreglos

Para realizar la multiplicación entre dos arreglos utiliza el método matmul o utilizamos el operador @:
1
a = np.array([
2
[2, 2]
3
])
4
b = np.array([
5
[2],
6
[2]
7
])
8
np.matmul(a, b) # [[8]]
9
a @ b # [[8]]
Copied!
A esta multiplicación se le llama también producto de matrices o producto punto, y es diferente a la multiplicación elemento a elemento. Veamos otro ejemplo:
1
a = np.array([
2
[1, 0],
3
[0, 1]
4
])
5
b = np.array([
6
[4, 1],
7
[2, 2]
8
])
9
10
np.matmul(a, b) # [[4, 1], [2, 2]]
11
a @ b # [[4, 1], [2, 2]]
Copied!
Si queremos multiplicar elemento a elemento utilizaríamos el operador asterisco (*):
1
a * b # [[4, 0], [0, 2]]
Copied!

Transponer un arreglo

Para transponer un arreglo utiliza el método transpose o el atributo T:
1
arr = np.array([
2
[1,2],
3
[3,4]
4
])
5
arr.T
6
# [[1, 3],
7
# [2, 4]]
Copied!

Cargando y guardando arreglos en archivos CSV

Para cargar y guardar arreglos en CSV (archivos separados por coma) utiliza los métodos loadtxt y savetxt.
1
arr = np.array([34,9,12,11,7])
2
3
# Guardar a un archivo CSV
4
np.savetxt('arreglo.csv', arr, delimeter=',')
5
6
# Cargar de un archivo CSV
7
arr = np.loadtxt('arreglo.csv') # [34,9,12,11,7]
Copied!
Si necesitamos manejar datos faltantes es mejor utilizar el método genfromtxt.
Last modified 6mo ago