Basicos de NumPy: arreglos
Categorias de manipulaciones básicas de arreglos:
- Atributos de arrays
- Indexado de arrays
- Rebanadas de arrays
- Reformado de arrays
- Union y separación de arrays
Atributos de Arrays¶
import numpy as np
np.random.seed(0) # seed for reproducibility
x1 = np.random.randint(10, size=6) # One-dimensional array
x2 = np.random.randint(10, size=(3, 4)) # Two-dimensional array
x3 = np.random.randint(10, size=(3, 4, 5)) # Three-dimensional array
print("x3 ndim: ", x3.ndim)
print("x3 shape:", x3.shape)
print("x3 size: ", x3.size)
print("dtype:", x3.dtype)
print("itemsize:", x3.itemsize, "bytes")
print("nbytes:", x3.nbytes, "bytes")
Indexado de Arrays : Acceso a elementos individuales¶
x1
x1[0]
x1[4]
x1[-1]
x1[-2]
x2
x2[0, 0]
x2[2, 0]
x2[2, -1]
x2[0, 0] = 12
x2
x1[0] = 3.14159 # this will be truncated!
x1
Rebanadas de Arrays: Accesa a partes (subarrays)¶
x[start:stop:step]
Uni-dimensionales¶
x = np.arange(10)
x
x[:5] # first five elements
x[5:] # elements after index 5
x[4:7] # middle sub-array
x[::2] # every other element
x[1::2] # every other element, starting at index 1
x[::-1] # all elements, reversed
x[5::-2] # reversed every other from index 5
Multi-dimensionales¶
x2
x2[:2, :3] # two rows, three columns
x2[:3, ::2] # all rows, every other column
x2[::-1, ::-1]
Accesando renglones y columnas del array¶
print(x2[:, 0]) # first column of x2
print(x2[0, :]) # first row of x2
print(x2[0]) # equivalent to x2[0, :]
Subarrays son vistas y no copias¶
- Es importante, y práctico, entender que las rebanadas de arrays son vistas del trozo y no copias del subarray
print(x2)
extraer un subarray de $2 \times 2$ de éste:
x2_sub = x2[:2, :2]
print(x2_sub)
Ahora si modificamos este subarray, el array original también cambia! Miren:
x2_sub[0, 0] = 99
print(x2_sub)
print(x2)
- Este comportamiento es de utilidad pues se pueden acceder y procesar partes de los arrays sin tener que hacer copias de ellos
Creando copias de arrays¶
- En ocasiones será práctico crear copias explícitas de los datos
- Esto se hace con el método
copy()
:
x2_sub_copy = x2[:2, :2].copy()
print(x2_sub_copy)
Si ahora modificamos este subarray, el original no cambia:
x2_sub_copy[0, 0] = 42
print(x2_sub_copy)
print(x2)
Reformado (reshaping) de Arrays¶
- Podemos cambiar la forma (reformar) de un array usando el método
reshape
Por ejemplo, si queremos los número del 1 al 9 en un array de $3 \times 3$, podemos hacer lo siguiente:
grid = np.arange(1, 10).reshape((3, 3))
print(grid)
x = np.array([1, 2, 3])
# row vector via reshape
x.reshape((1, 3))
# row vector via newaxis
x[np.newaxis, :]
# column vector via reshape
x.reshape((3, 1))
# column vector via newaxis
x[:, np.newaxis]
Concatenación y Separación de Arrays¶
- Es posible combinar multiples arrays en uno
- Es posible separar un array a multiples arrays
Concatenación de arrays¶
Concatenacion, o unión de dos arrays en NumPy, se puede hacer con np.concatenate
, np.vstack
, y np.hstack
.
np.concatenate
toma una tupla o lista de arrays como primer argumento:
x = np.array([1, 2, 3])
y = np.array([3, 2, 1])
np.concatenate([x, y])
z = [99, 99, 99]
print(np.concatenate([x, y, z]))
grid = np.array([[1, 2, 3],
[4, 5, 6]])
# concatenate along the first axis
np.concatenate([grid, grid])
# concatenate along the second axis (zero-indexed)
np.concatenate([grid, grid], axis=1)
x = np.array([1, 2, 3])
grid = np.array([[9, 8, 7],
[6, 5, 4]])
# vertically stack the arrays
np.vstack([x, grid])
# horizontally stack the arrays
y = np.array([[99],
[99]])
np.hstack([grid, y])
Separación de arrays¶
El opuesto a la concatenación es la sepación, implementada en las funciones np.split
, np.hsplit
, y np.vsplit
. Para cada una de éstas podemos pasar una lista de índices en donde se quiere hacer la separación:
x = [1, 2, 3, 99, 99, 3, 2, 1]
x1, x2, x3 = np.split(x, [3, 5])
print(x1, x2, x3)
N puntos-de-separación, crean N + 1 subarrays.
grid = np.arange(16).reshape((4, 4))
grid
upper, lower = np.vsplit(grid, [2])
print(upper)
print(lower)
left, right = np.hsplit(grid, [2])
print(left)
print(right)