Indexado y slicing
El indexado de NumPy parece el de listas, pero anade indices multidimensionales, mascaras booleanas e indexado fancy. Ademas, muchos slices son vistas: mutarlos muta el array original.
Basico
python
import numpy as np
a = np.arange(10)
a[0], a[-1]
a[2:7]
a[::2]
a[:5] = 0 # modifica a2D
python
m = np.arange(12).reshape(3, 4)
m[1, 2] # elemento
m[0:2, 1:3] # submatriz
m[:, 0] # primera columna
m[1, :] # segunda filaVistas vs copias
python
m = np.arange(6).reshape(2, 3)
v = m[0, :] # vista
v[:] = 99
print(m) # la primera fila cambio
c = m[0, :].copy()
c[:] = 0
print(m) # intactoRegla: si vas a modificar un recorte y no quieres side effects, .copy().
Mascaras booleanas
python
a = np.array([3, 1, 4, 1, 5, 9])
a[a > 3]
a[a > 3] = 0Combinaciones:
python
mask = (a >= 1) & (a <= 5)
a[mask]Usa & | ~ con parentesis; and/or de Python no funcionan elemento a elemento.
Fancy indexing
python
a = np.array([10, 20, 30, 40])
a[[0, 2, 3]]
m = np.arange(12).reshape(3, 4)
m[[0, 2], :]Fancy indexing suele devolver copia, no vista.
np.where
python
a = np.array([3, -1, 2, -4])
np.where(a >= 0, a, 0) # clip negativo a 0
idx = np.where(a < 0) # indicesErrores habituales
- Modificar una vista y corromper el dataset original.
- Indexar con
anden vez de&. - Asumir que
m[0]ym[0, :]siempre copian.
Buenas practicas
- Filtra con mascaras en vez de bucles.
- Documenta cuando una funcion devuelve vista.
- Para asignaciones complejas, prefiere
np.whereo mascaras claras.
Ejercicio
- Dado
arange(16).reshape(4, 4), extrae el bloque central 2x2. - Pon a
-1todos los pares con mascara. - Demuestra una vista mutando un slice y una copia segura.
Siguiente paso
Continua con Operaciones vectorizadas.
