Crear arrays
Un array guarda valores de un solo tipo en una cuadrícula con cualquier número de dimensiones.
| Tarea | Código |
|---|
| Importar NumPy | import numpy as np |
| Desde una lista | np.array([1, 2, 3]) |
| 2D desde listas anidadas | np.array([[1, 2, 3], [4, 5, 6]]) |
| Ceros, unos, un valor de relleno | np.zeros((2, 3)), np.ones(4), np.full((2, 2), 7) |
| Rango con paso (sin el final) | np.arange(0, 10, 2) # [0 2 4 6 8] |
| n puntos equiespaciados (con el final) | np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1.] |
| Matriz identidad | np.eye(3) |
| Misma forma que otro array | np.zeros_like(m), np.ones_like(m) |
| Elegir el tipo de elemento | np.array([1, 2, 3], dtype=np.float32) |
| Mallas de coordenadas | xx, yy = np.meshgrid(np.arange(3), np.arange(2)) |
Inspeccionar un array
| Tarea | Código |
|---|
| Shape: tamaño de cada dimensión | m.shape # (3, 4) |
| Número de dimensiones | m.ndim # 2 |
| Número de elementos | m.size # 12 |
| Tipo de elemento | m.dtype # int64 |
| Convertir el tipo | m.astype(np.float64) |
| Longitud de la primera dimensión | len(m) # 3 |
| Volver a una lista de Python | m.tolist() |
| Mostrar menos decimales | np.set_printoptions(precision=3, suppress=True) |
Indexar y hacer slicing
Los slices son vistas: comparten memoria con el array original. Las máscaras y las listas de índices devuelven copias.
| Tarea | Código |
|---|
| Primer y último elemento | a[0], a[-1] |
| Slice start:stop (sin stop) | a[1:4] # [20 30 40] |
| Uno de cada dos, al revés | a[::2], a[::-1] |
| Un elemento de un array 2D | m[1, 2] # 6 |
| Una fila, una columna | m[0], m[:, 1] |
| Un bloque de filas y columnas | m[:2, 1:3] |
| Elementos que cumplen una condición | a[a > 25] # [30 40 50] |
| Combinar condiciones | a[(a > 15) & (a < 45)] |
| Elegir por una lista de posiciones | a[[0, 2, 4]] |
| Posiciones que cumplen | np.flatnonzero(a > 25) # [2 3 4] |
| Elegir elemento a elemento | np.where(a > 25, a, 0) |
| Copiar antes de modificar un slice | part = a[1:3].copy() |
| Asignar valores con una máscara | a[a > 40] = 0 |
Operaciones y broadcasting
Los operadores trabajan elemento a elemento. El broadcasting estira un escalar, una fila o una columna hasta la forma del otro array.
| Tarea | Código |
|---|
| Aritmética elemento a elemento | x + y, x - y, x * y, x / y, x ** 2 |
| Con un escalar | x * 10 |
| Raíz cuadrada, exponencial, logaritmo | np.sqrt(x), np.exp(x), np.log(x) |
| Valor absoluto, redondeo | np.abs(x - 5), np.round(x / 3, 2) |
| Limitar valores a un rango | np.clip(x, 2, 8) |
| Máximo elemento a elemento | np.maximum(x, 3) |
| Producto escalar | x @ y # 37.0 |
| Centrar cada columna (broadcast de una fila) | m - m.mean(axis=0) |
| Escalar cada fila (broadcast de una columna) | m / m.sum(axis=1, keepdims=True) |
| Comparar floats con seguridad | np.isclose(0.1 + 0.2, 0.3) # True, np.allclose(x, y) |
| Trigonometría y pi | np.sin(np.pi / 2) # 1.0 |
Agregar a lo largo de un eje
axis=0 recorre las filas hacia abajo y da un resultado por columna. axis=1 recorre las columnas y da un resultado por fila.
| Tarea | Código |
|---|
| Suma de todos los elementos | m.sum() # 21 |
| Un resultado por columna | m.sum(axis=0) # [5 7 9] |
| Un resultado por fila | m.sum(axis=1) # [ 6 15] |
| Media y desviación estándar | m.mean(), m.std(), m.mean(axis=0) |
| Mínimo, máximo | m.min(), m.max(axis=1) |
| Posición del máximo | m.argmax(), m.argmax(axis=1) |
| Mediana y percentiles | np.median(m), np.percentile(m, [25, 50, 75]) |
| Suma acumulada | np.cumsum(m, axis=1) |
| Producto de todos los elementos | m.prod() # 720 |
| Alguno, todos, contar | (m > 4).any(), (m > 0).all(), np.count_nonzero(m > 2) |
Cambiar de forma y combinar
Un reshape conserva los elementos y cambia la forma, así que el tamaño total debe ser el mismo.
| Tarea | Código |
|---|
| Nueva forma | a.reshape(2, 3) |
| Dejar que NumPy calcule un tamaño | a.reshape(3, -1), a.reshape(-1, 1) |
| Aplanar a 1D | m.ravel(), m.flatten() |
| Transponer | m.T |
| Añadir una dimensión | a[:, np.newaxis], np.expand_dims(a, axis=0) |
| Quitar dimensiones de tamaño 1 | np.squeeze(np.ones((1, 3, 1))) |
| Unir a lo largo de un eje existente | np.concatenate([a, a]) |
| Apilar filas o columnas | np.vstack([m, m]), np.hstack([m, m]) |
| Arrays 1D como columnas | np.column_stack([a, a ** 2]) |
| Apilar en un eje nuevo | np.stack([a, a], axis=0) # shape (2, 6) |
| Dividir en trozos | np.split(a, 3), np.array_split(a, 4) |
| Repetir o replicar en mosaico | np.repeat([1, 2], 2) # [1 1 2 2], np.tile([1, 2], 2) # [1 2 1 2] |
Ordenar, buscar y valores únicos
| Tarea | Código |
|---|
| Copia ordenada | np.sort(a) |
| De mayor a menor | np.sort(a)[::-1] |
| Posiciones que ordenarían el array | np.argsort(a) |
| Los tres valores más grandes | np.sort(a)[-3:] |
| Valores únicos y sus conteos | values, counts = np.unique(a, return_counts=True) |
Nombres de NumPy 2 (unique_values puede no ordenar) | np.unique_values(a), np.unique_counts(a) |
| ¿Está cada elemento en una lista? | np.isin(a, [1, 9]) |
| Posición de inserción en un array ordenado | np.searchsorted([1, 3, 5, 7], 4) # 2 |
| Operaciones de conjuntos | np.intersect1d(a, [1, 2, 10]), np.union1d(a, [10]), np.setdiff1d(a, [1]) |
| Ordenar filas por una columna | m[m[:, 1].argsort()] |
Números aleatorios
Crea un Generator con semilla y saca todo de él, para que los resultados se repitan en cada ejecución.
| Tarea | Código |
|---|
| Generador con semilla | rng = np.random.default_rng(42) |
| Floats en [0, 1) | rng.random(3) |
| Enteros, sin el extremo superior | rng.integers(1, 7, size=10) |
| Distribución normal | rng.normal(loc=0, scale=1, size=(2, 3)) |
| Floats uniformes en un rango | rng.uniform(5, 10, size=4) |
| Elegir de una lista | rng.choice(["a", "b", "c"], size=5) |
| Elegir sin repetición | rng.choice(10, size=3, replace=False) |
| Elegir con pesos | rng.choice(["H", "T"], size=10, p=[0.7, 0.3]) |
| Copia barajada, barajar in situ | rng.permutation(a), rng.shuffle(a) |
| Conteos binomiales y de Poisson | rng.binomial(10, 0.5, size=5), rng.poisson(3, size=5) |
Álgebra lineal
| Tarea | Código |
|---|
| Producto de matrices | A @ A |
| Resolver Ax = b | np.linalg.solve(A, b) # [0.8 1.4] |
| Inversa y determinante | np.linalg.inv(A), np.linalg.det(A) |
| Norma de un vector | np.linalg.norm(b) |
| Autovalores y autovectores | values, vectors = np.linalg.eig(A) |
| Ajustar una recta | slope, intercept = np.polyfit(x, y, 1) |
| Producto exterior | np.outer([1, 2], [3, 4]) |
| Diagonal y traza | np.diag(A), np.trace(A) |
Valores faltantes y especiales
np.nan marca un float faltante. Cualquier operación con él da nan, así que usa las funciones nan o una máscara.
| Tarea | Código |
|---|
| Valor faltante | np.nan |
| Encontrar valores faltantes | np.isnan(v), np.isnan(v).sum() |
| Eliminar valores faltantes | v[~np.isnan(v)] |
| Reemplazar faltantes e infinitos | np.nan_to_num(v, nan=0.0, posinf=0.0) |
| Comprobar infinitos y finitos | np.inf, np.isfinite(v) |
| Estadísticas que ignoran NaN | np.nanmean(v[:3]) # 2.0, np.nanmax(v) |
Guardar y cargar
| Tarea | Código |
|---|
| Un array, archivo binario | np.save("data.npy", m), m = np.load("data.npy") |
| Varios arrays en un archivo | np.savez("data.npz", x=x, y=y), np.load("data.npz")["x"] |
| Escribir texto CSV | np.savetxt("data.csv", m, delimiter=",", fmt="%d") |
| Leer texto CSV | np.loadtxt("data.csv", delimiter=",") |
NumPy 2: nombres antiguos y qué escribir ahora
NumPy 2 eliminó muchos alias, así que el código copiado de tutoriales antiguos puede fallar con un AttributeError.
| Tarea | NumPy 2 | Forma antigua |
|---|
| Valor faltante | np.nan | np.NaN |
| Infinito | np.inf | np.Inf |
| Tipo float de 64 bits | np.float64 | np.float_ |
| Área bajo una curva | np.trapezoid(y, x) | np.trapz(y, x) |
| ¿Está cada elemento en otro array? | np.isin(a, b) | np.in1d(a, b) |
| Apilar filas | np.vstack([a, a]) | np.row_stack([a, a]) |
| Producto | np.prod(a) | np.product(a) |
| Números aleatorios | rng = np.random.default_rng(0)
rng.random(3) | np.random.seed(0)
np.random.rand(3) |
Las llamadas de NumPy sobre las que se construye el código de ciencia de datos, ordenadas por tarea: crear arrays, inspeccionarlos, indexar y hacer slicing, operar elemento a elemento, agregar a lo largo de un eje, cambiar de forma y combinar, ordenar y buscar, generar números aleatorios y resolver álgebra lineal. Cada fila es un fragmento corto que puedes pegar, con una línea que explica qué hace.
Todo está escrito para NumPy 2, la versión que usa Coddy, y la última tabla recoge los nombres que NumPy 2 eliminó, junto a lo que debes escribir en su lugar. La mayoría de los ejemplos usan a = np.array([3, 1, 4, 1, 5, 9, 2, 6]) y m = np.arange(12).reshape(3, 4). ¿Empiezas con Python? Arranca por la hoja de trucos de Python y el playground de Python, y ten a mano las hojas de trucos de pandas, Matplotlib y scikit-learn junto a esta.