NumPy Fundamentos
NumPy (Numerical Python) es la piedra angular de todo el ecosistema de Data Science en Python. Pandas, Matplotlib, Seaborn, scikit-learn — todos están construidos sobre NumPy. Cuando pandas calcula una media, por debajo está usando un array de NumPy. Entender NumPy te da el poder de escribir código numérico que es hasta 100x más rápido que los bucles de Python puro.
Concepto teórico
¿Por qué NumPy es tan rápido?
Una lista de Python es un contenedor genérico: cada elemento puede ser de cualquier tipo (int, string, lista…), y cada uno se almacena en una ubicación de memoria distinta. Un array de NumPy es un bloque contiguo de memoria donde todos los elementos son del mismo tipo. Esto permite:
- Operaciones vectorizadas: en vez de recorrer elemento por elemento con un bucle, NumPy aplica la operación a todo el array de golpe (internamente usa C compilado).
- Broadcasting: operaciones entre arrays de distinto tamaño se expanden automáticamente sin copiar datos.
- Memoria eficiente: un array de 1 millón de enteros ocupa ~4MB. Una lista de Python con los mismos números ocupa ~28MB.
ndarray: el objeto central
Todo en NumPy gira alrededor del ndarray (N-dimensional array). Sus atributos clave:
| Atributo | Qué dice | Ejemplo |
|---|---|---|
.shape |
Dimensiones | (3, 4) → 3 filas × 4 columnas |
.ndim |
Número de dimensiones | 2 → es una matriz 2D |
.dtype |
Tipo de datos | float64, int32 |
.size |
Total de elementos | 12 (3 × 4) |
.nbytes |
Memoria en bytes | 96 (12 × 8 bytes) |
Formas de crear arrays
| Función | Qué crea | Ejemplo |
|---|---|---|
np.array([1,2,3]) |
Desde una lista | [1, 2, 3] |
np.zeros((3,4)) |
Matriz de ceros | 3×4 de 0.0 |
np.ones((2,3)) |
Matriz de unos | 2×3 de 1.0 |
np.arange(0, 10, 2) |
Secuencia con paso | [0, 2, 4, 6, 8] |
np.linspace(0, 1, 5) |
N puntos equidistantes | [0, .25, .5, .75, 1] |
np.random.normal(0,1,100) |
Distribución normal | 100 valores con μ=0, σ=1 |
np.eye(3) |
Matriz identidad | 3×3 con 1s en la diagonal |
[1,2,3] * 3 en Python da [1,2,3,1,2,3,1,2,3] (repetición).
np.array([1,2,3]) * 3 da [3, 6, 9] (multiplicación elemento a elemento). Esto es
fundamental y fuente de bugs cuando mezclas listas y arrays.
np.where(), np.random para simulaciones,
np.log() para transformaciones, o cuando un modelo de scikit-learn te devuelve un array de
predicciones. Entender NumPy te hace más eficiente con todas estas herramientas.
Ejemplos explicados paso a paso
Ejemplo 1: Crear arrays y explorar sus atributos
Conocer la forma, tipo y tamaño de un array es como el .shape y .dtypes del EDA pero
a nivel atómico.
Hacé clic en ▶ Ejecutar
Ejemplo 2: Operaciones vectorizadas — Adiós a los bucles
La gran ventaja de NumPy: aplicar operaciones matemáticas a millones de elementos sin escribir for loops.
Hacé clic en ▶ Ejecutar
Ejemplo 3: Indexación y slicing
NumPy extiende el slicing de Python con indexación avanzada: booleana, fancy indexing y slicing multidimensional.
Hacé clic en ▶ Ejecutar
m[filas, columnas] es la
clave. m[:, 0] = todas las filas, columna 0. m[1:3, :] = filas 1 y 2, todas las
columnas. Practicá esta notación hasta que sea natural — la vas a usar constantemente.Ejemplo 4: Estadísticas y agregaciones
NumPy tiene funciones estadísticas optimizadas que son las mismas que pandas usa internamente. También podés agregar por eje (fila o columna).
Hacé clic en ▶ Ejecutar
axis=0 opera a lo largo de las filas (el resultado tiene una columna). axis=1
opera a lo largo de las columnas (el resultado tiene una fila). Pensalo así: axis=0
"colapsa" las filas → resultado por columna. axis=1 "colapsa" las columnas → resultado por fila.
Ejemplo 5: Reshape y broadcasting
Reshape cambia la forma de un array sin copiar datos. Broadcasting permite operar arrays de distinto tamaño automáticamente.
Hacé clic en ▶ Ejecutar
Referencia rápida
| Operación | Función | Ejemplo |
|---|---|---|
| Crear array | np.array() |
np.array([1,2,3]) |
| Ceros / Unos | np.zeros() / ones() |
np.zeros((3,4)) |
| Secuencia | np.arange() / linspace() |
np.arange(0,10,2) |
| Random | np.random.normal() |
np.random.normal(0,1,100) |
| Forma | .shape / .reshape() |
a.reshape(3,4) |
| Suma / Media | .sum() / .mean() |
a.mean(axis=0) |
| Min / Max | .min() / .max() |
a.max(axis=1) |
| Desv. std | .std() |
a.std() |
| Filtro booleano | a[a > 5] |
Elementos mayores a 5 |
| IF vectorizado | np.where(cond, si, no) |
np.where(a>0,"pos","neg") |
| Operaciones | + - * / ** |
Elemento a elemento |
Ejercicios
Ejercicio 1: Crear un array y explorar atributos
Creá un array 2D de forma (3, 4) con np.arange(12).reshape(3,4). Imprimí su shape.
Debe incluir (3, 4).
Hacé clic en ▶ Ejecutar
Ejercicio 2: Operaciones vectorizadas
Calculá el total de ventas (precios * cantidades) y la suma total. Debe incluir
2300.
Hacé clic en ▶ Ejecutar
Ejercicio 3: Filtrado booleano
Filtrá los valores mayores a 50 del array. Imprimí cuántos son. Debe incluir 3.
Hacé clic en ▶ Ejecutar
Ejercicio 4: Estadísticas con axis
Dada una matriz 3×4 de ventas, calculá el promedio por fila (axis=1). Imprimí el promedio de la
primera fila, debe incluir 25.0.
Hacé clic en ▶ Ejecutar
Ejercicio 5: np.where() — IF vectorizado
Usá np.where() para clasificar notas en "Aprobado" (≥60) o "Desaprobado". Debe incluir
Aprobado.
Hacé clic en ▶ Ejecutar
Ejercicio 6: Broadcasting — aplicar IVA
Multiplicá un array de precios por 1.21 (IVA). Imprimí el primer precio con IVA. Debe incluir
121.0.
Hacé clic en ▶ Ejecutar
Ejercicio 7: Slicing 2D
De una matriz 4×5, extraé la submatriz de las filas 1 a 2 y columnas 2 a 4 con slicing. Imprimí su shape.
Debe incluir (2, 3).
Hacé clic en ▶ Ejecutar
Ejercicio 8: Generar datos aleatorios y estadísticas
Generá 1000 valores con distribución normal (μ=500, σ=100). Imprimí media, std y percentil 95. Debe incluir
un valor cercano a 500.
Hacé clic en ▶ Ejecutar
Ejercicio 9: Reshape y operaciones por eje
Reshape un array de 12 elementos a (3,4). Calculá la suma por columna (axis=0). Imprimí el
resultado. Debe incluir 15.
Hacé clic en ▶ Ejecutar
Ejercicio 10: Simulación Montecarlo del IVA
Simulá 10,000 ventas con precios aleatorios (normal μ=500, σ=200, mínimo 50). Calculá IVA (21%), filtrá
ventas >$800 y contá qué porcentaje del total representan. Debe incluir %.
Hacé clic en ▶ Ejecutar
Resumen y conexión
- NumPy arrays son bloques contiguos de memoria con tipo homogéneo → operaciones 10-100x más rápidas que listas.
- Operaciones vectorizadas eliminan los bucles:
a * bmultiplica elemento a elemento sinfor. - Broadcasting expande arrays de distinto tamaño automáticamente para operar juntos.
- axis=0 colapsa filas (resultado por columna), axis=1 colapsa columnas (resultado por fila).
- Indexación booleana (
arr[arr > 50]) es la forma más eficiente de filtrar datos numéricos. np.where()es el IF vectorizado — la base delnp.whereque usaste en pandas.
En la siguiente lección (14 · Intro a Machine Learning) vas a descubrir cómo las máquinas aprenden de los datos. NumPy es la base sobre la que se construyen todos los modelos — los datos siempre terminan como arrays numéricos.
Recursos: NumPy Quick Start · API Reference