NumPy para científicos de datos: una guía práctica
NumPy para científicos de datos es la biblioteca básica de Python para computación numérica: proporciona ndarray, un bloque de memoria contiguo de tipo fijo que admite operaciones vectorizadas en N dimensiones. NumPy se lanzó en 2006 y ahora está disponible en la versión 2.x. Es la base de pandas, SciPy, scikit-learn y prácticamente todas las pilas científicas de Python que tocarás.
Conclusiones clave
- ndarray es una vista tipada y con saltos sobre un búfer contiguo: comprender los saltos (strides) y los dtypes explica la mayoría de las sorpresas de rendimiento y memoria que encontrará al usar NumPy para científicos de datos.
- La vectorización supera a los bucles de Python en uno o dos órdenes de magnitud en cargas de trabajo numéricas típicas, pero solo cuando la operación se asigna a los núcleos compilados de NumPy.
- El broadcasting es un conjunto de reglas de alineación, no mágicas: las dimensiones se comparan de derecha a izquierda y deben ser iguales o 1.
- NumPy 2.0 cambió el tipo de entero predeterminado en Windows y endureció las reglas de promoción, por lo que el código que funcionó silenciosamente en 1.26 puede cambiar el dtype o lanzar un error en 2.x.
- Para trabajos tabulares, pandas suele ser la capa correcta; NumPy es la capa adecuada para matrices, álgebra lineal, procesamiento de señales y el núcleo numérico de canalizaciones personalizadas.
- El diseño de la memoria (orden C versus orden Fortran) y la semántica de copiar versus ver deciden si una matriz de 10 GB cabe en RAM o se duplica silenciosamente.
¿Qué es exactamente NumPy en la ciencia de datos?
Para un enfoque de NumPy para científicos de datos, se entiende mejor como el sustrato de matriz debajo del resto de la pila. Cuando llamas a pandas.DataFrame.to_numpy(), entrenas un estimador de scikit-learn o lees un fragmento de un archivo HDF5 con h5py, los datos llegan a un ndarray. Ese único tipo de objeto (un dtype, una forma, un búfer de memoria) es lo que hace que las bibliotecas posteriores sean rápidas y predecibles.
El alcance de la biblioteca es más limitado de lo que esperan los recién llegados. NumPy no realiza datos etiquetados, semántica de valores faltantes ni agregación agrupada; pandas lo hace. NumPy no realiza optimización, interpolación ni álgebra lineal dispersa; SciPy lo hace. NumPy realiza matrices densas de N dimensiones, matemáticas por elementos, transmisión, reducciones, indexación, generación de números aleatorios y una interfaz de álgebra lineal para BLAS y LAPACK. Saber dónde se encuentra ese límite evita el error común de volver a implementar pandas dentro de NumPy.
El ndarray: Tres atributos que lo explican todo
Un ndarray se describe mediante tres cosas: “forma”, “tipo d” y “saltos (strides)”. La forma es la dimensionalidad lógica. Dtype corrige la interpretación de cada elemento: float64, int32, complex128, datetime64[ns] o un registro estructurado. Los saltos dan el desplazamiento de bytes al paso para cada eje.
Los saltos son la razón por la que arr[::2] y arr.T son gratuitos. Cortar con un paso o transponer no mueve datos; devuelve una nueva vista con diferentes saltos sobre el mismo búfer.
La remodelación de una matriz contigua a C también es una vista. La indexación elegante (arr[[0, 5, 9]]) y el enmascaramiento booleano, por el contrario, siempre asignan una nueva matriz. En una canalización que procesa matrices de varios gigabytes, la diferencia entre una vista y una copia es la diferencia entre finalizar e intercambiar.
Relacionado: — Cursos interactivos de Python y ciencia de datos que codifica directamente en el navegador.
Un hábito práctico para usar numpy para tareas de científicos de datos: después de cualquier operación de indexación no trivial, verifique arr.base is None para ver si es dueño de la memoria, y arr.flags['C_CONTIGUOUS'] para ver si el diseño es lo que espera una rutina posterior de C o Fortran. La propia documentación de NumPy sobre el diseño de la memoria interna es la referencia autorizada aquí.
Uso de NumPy en ciencia de datos: dónde realmente se gana su lugar
Para un flujo de trabajo de NumPy para los científicos de datos, el uso de NumPy se agrupa en cinco trabajos recurrentes.
Preprocesamiento numérico a escala. La estandarización de funciones, los transformación logarítmica de recuentos, el recorte de valores atípicos y el cálculo de distancias por pares son operaciones de reducción o por elementos. Hacerlos en un ndarray evita la sobrecarga de Python por fila.
Vale la pena echarle un vistazo: — Una suscripción para certificados de ciencia de datos y Python respaldados por la universidad.
Álgebra lineal. Los mínimos cuadrados, PCA a través de SVD, la estimación de covarianza y la resolución de sistemas densos se dirigen a través de numpy.linalg, que llama a las mismas bibliotecas BLAS/LAPACK que usan MATLAB y R. Una compilación OpenBLAS o MKL bien ajustada puede ser varias veces más rápida que una compilación sencilla en la misma máquina.
Simulación aleatoria. numpy.random.default_rng() (la API del generador introducida en NumPy 1.17) proporciona flujos reproducibles y estadísticamente con mejor comportamiento que el heredado RandomState. El trabajo de Monte Carlo, el remuestreo de arranque y las pruebas de permutación se encuentran aquí.
Interfaz con formatos binarios. HDF5, NetCDF, Zarr y archivos sin formato mapeados en memoria exponen interfaces similares a matrices. np.memmap le permite trabajar en una matriz más grande que la RAM paginando desde el disco.
Pegamento entre bibliotecas. La conversión entre pandas, PyTorch y xarray generalmente pasa por NumPy. El protocolo de búfer significa que estas conversiones suelen ser de copia cero.
¿Es NumPy importante para la ciencia de datos? La respuesta honesta
NumPy es importante para un científico de datos porque es una dependencia, no porque sea siempre la interfaz en la que escribe. Un científico de datos que trabaja puede pasar meses sin escribir “import numpy as np” directamente, sin embargo, cada operación de pandas, cada ajuste de scikit-learn y cada gráfico de matplotlib ejecuta código NumPy debajo.
La importancia es estructural. NumPy define la API de matriz con la que está de acuerdo el resto del ecosistema: una especificación ahora formalizada como el estándar Python Array API, que permite a bibliotecas como CuPy, JAX y PyTorch exponer interfaces compatibles. Por lo tanto, aprender NumPy se trata menos de memorizar funciones y más de aprender el modelo mental que se transfiere a cada biblioteca de matrices que usará después.
Donde NumPy no es la respuesta: ETL con muchas cadenas, uniones entre tablas heterogéneas, remuestreo de series temporales con marcas de tiempo irregulares y cualquier cosa que requiera una evaluación diferida de conjuntos de datos que no caben en la memoria. Busque pandas, Polars, DuckDB o Dask en esos casos.
Vectorización, radiodifusión y las reglas que muerden
La radiodifusión compara formas desde la derecha. Dos dimensiones son compatibles si son iguales o una de ellas es 1; la dimensión de tamaño 1 se estira sin copiar.
Una matriz de características (1000, 3) menos un vector medio (3,) funciona. Una matriz (1000, 3) menos un vector (1000,) lanza un error, porque las dimensiones finales 3 y 1000 no están de acuerdo, y la solución casi siempre es mean[:, None], no un bucle. Este es un concepto crítico en numpy para los flujos de trabajo de los científicos de datos.
Tres modos de falla se repiten en el código real:
- Productos externos accidentales.
a[:, None] * b[None, :]en dos vectores de 100k elementos asigna 10^10 flotantes. Eso es 80 GB en float64. Divídalo en trozos o utilice una formulación que se reduzca inmediatamente. - Desbordamiento de enteros. La aritmética
np.int32se ajusta silenciosamente. Sumar recuentos grandes en int32 es una fuente clásica de totales negativos. - Operaciones in situ en vistas.
arr[::2] += 1modifica el búfer principal. Esto es a menudo lo que desea y, en ocasiones, un error que corrompe una matriz almacenada en caché.
Elegir la herramienta adecuada: NumPy frente a las alternativas
| Tarea | Mejor primera opción | Por qué |
|---|---|---|
| Datos tabulares etiquetados, uniones, agrupaciones | pandas o polares | Alineación de índices y semántica de valores perdidos |
| Matrices numéricas densas, álgebra lineal | NumPy | Acceso directo a BLAS/LAPACK, gastos generales mínimos |
| Matrices más grandes que la RAM | Dask, Zarr o np.memmap | Ejecución fragmentada o paginada |
| Matemáticas de matriz aceleradas por GPU | CuPy o JAX | API compatible con NumPy, ejecución de dispositivo |
| Matrices dispersas | SciPy sparse | Escalas de memoria con valores distintos de ceros |
| Autodiff y JIT para código de investigación | JAX | Transformaciones funcionales sobre programas de matriz |
La regla de decisión: si sus datos tienen etiquetas de fila significativas y tipos de columnas mixtos, comience con pandas. Si se trata de un bloque numérico homogéneo y le preocupa el rendimiento, comience con NumPy, la herramienta esencial de numpy para los científicos de datos. Si no cabe en la memoria, comience con un marco fragmentado y pase a NumPy dentro de cada fragmento.
Prácticas de desempeño que realmente mueven la aguja
Haga coincidir el tipo de problema. float32 reduce a la mitad la memoria y puede duplicar el rendimiento en hardware con proporciones 2:1 FP32:FP64, a costa de aproximadamente siete dígitos decimales de precisión. Para solucionadores iterativos y simulaciones largas, ese error se acumula; para el preprocesamiento orientado a la visualización, suele estar bien.
Preasignar y completar. La expansión de matrices usando np.append en un bucle reasigna cada iteración. Asigne la salida una vez y asígnela en trozos.
Utilice out= para evitar temporales. np.multiply(a, b, out=c) escribe en la memoria existente. En bucles cerrados sobre matrices grandes, esto elimina la presión de asignación y mejora el comportamiento de la caché.
Prefiere reducciones a la materialización. np.einsum y np.dot expresan contracciones sin construir matrices intermedias. (a[:, None] * b[None, :]).sum(axis=1) y a * b.sum() calculan lo mismo con perfiles de memoria tremendamente diferentes.
Sepa cuándo dejar NumPy. Para funciones por elementos con ramas, Numba o Cython pueden superar a NumPy vectorizado porque evitan las matrices temporales por completo. Para cualquier cosa con un bucle a nivel de Python sobre filas, el problema es el bucle, no NumPy.
NumPy 2.x: qué cambió y por qué es importante
NumPy 2.0, lanzado en junio de 2024, es el primer aumento importante de versión desde 2006. Tres cambios afectan el código de trabajo de la comunidad de científicos de datos numpy.
El tipo de entero predeterminado en Windows pasó de int32 a int64, alineándose con Linux y macOS. NEP 50 reforzó la promoción de tipos para que los escalares de Python ya no envíen matrices de manera sorprendente: np.float32(1) + 1.0 ahora permanece float32. Y se reorganizó la API de C, lo que rompió la compatibilidad binaria: las extensiones compiladas con 1.x deben reconstruirse.
Para la mayoría del código de análisis, la migración transcurre sin incidentes, pero el código numérico que se basa en la conversión ascendente implícita puede cambiar los resultados en los últimos bits. Ejecute su conjunto de pruebas con 2.x antes de actualizar un entorno de producción y fije versiones en artefactos de investigación reproducibles. Las notas de la versión de NumPy documentan cada cambio.
Notas de reproducibilidad para grupos de laboratorio
El trabajo numérico reproducible para un flujo de trabajo de NumPy para científicos de datos depende de más que una semilla. Registre la versión de NumPy, la implementación de BLAS (OpenBLAS, MKL y Accelerate dan diferentes resultados de último bit para la misma operación), el número de subprocesos y el tipo de cada matriz que alimenta una cifra publicada. np.show_config() imprime los detalles de la compilación.
La suma de punto flotante no es asociativa, por lo que las reducciones paralelas pueden diferir entre ejecuciones. Si un resultado debe ser idéntico en bits, use np.sum con suma por pares en un solo hilo, o use la suma de Kahan explícitamente. Para canalizaciones de laboratorio compartidas, fije NumPy en un archivo de bloqueo y almacene el archivo de bloqueo junto con los datos.
Fuentes y lecturas adicionales
- Ciencia de datos — Wikipedia: La ciencia de datos es un campo académico interdisciplinario que utiliza estadística, computación científica, métodos científicos, procesamiento, visualización científica, algoritmos…
Preguntas frecuentes
¿Para qué se utiliza NumPy en la ciencia de datos?
NumPy proporciona la matriz N-dimensional y las operaciones vectorizadas en las que se basan la mayoría de las bibliotecas científicas de Python. Los científicos de datos utilizan numpy para tareas científicas de datos como preprocesamiento numérico, álgebra lineal, simulación aleatoria y como formato de intercambio entre pandas, scikit-learn, PyTorch y bibliotecas de trazado. El uso directo es común en tuberías personalizadas; El uso indirecto es universal.
¿Es NumPy importante para la ciencia de datos si uso principalmente pandas?
Sí, porque pandas almacena columnas numéricas como matrices NumPy y delega sus matemáticas a NumPy. Comprender los tipos de datos, las vistas frente a las copias y la transmisión explica el rendimiento y el comportamiento de la memoria de la mayoría de los pandas. Puede ser productivo sin escribir NumPy directamente, pero depurará más rápido si comprende la capa subyacente.
¿Debería aprender NumPy o pandas primero?
Aprenda NumPy primero si su trabajo implica simulaciones, señales, imágenes o algoritmos numéricos personalizados. Aprenda pandas primero si su trabajo es análisis tabular con columnas etiquetadas y tipos mixtos. En la práctica, unas pocas horas de NumPy (matrices, indexación, transmisión, reducciones) inmediatamente hacen que los pandas sean menos misteriosos.
¿Qué tan rápido es NumPy en comparación con los bucles puros de Python?
Las operaciones vectorizadas de NumPy normalmente se ejecutan uno o dos órdenes de magnitud más rápido que los bucles equivalentes de Python sobre los mismos datos, porque el bucle interno se ejecuta en C compilado sin sobrecarga del intérprete por elemento. La brecha se reduce o se invierte cuando la operación no se puede vectorizar, cuando las matrices son lo suficientemente pequeñas como para que la sobrecarga de llamada domine o cuando la forma vectorizada asigna temporales grandes.
¿NumPy maneja los datos faltantes?
NumPy tiene np.nan para flotantes y matrices enmascaradas np.ma, pero ninguno proporciona semántica de valores perdidos estilo pandas en todos los tipos. Desde NumPy 1.24, np.nan solo es válido para tipos flotantes y complejos, y las matrices de enteros no pueden contenerlo. Para un manejo real de datos faltantes, utilice tipos de pandas que acepten valores NULL o un marco dedicado.
¿Qué cambió en NumPy 2.0 que podría romper mi código?
NumPy 2.0 cambió el entero predeterminado de Windows a int64, adoptó reglas de promoción NEP 50 para que los escalares de Python ya no realicen un upcast de los arrays y reorganizó la API de C, rompiendo la compatibilidad binaria con extensiones creadas en 1.x. La mayor parte del código de análisis se ejecuta sin cambios, pero el código numérico sensible a la promoción de dtype debe volver a probarse.
Preguntas frecuentes
¿Para qué se utiliza NumPy en la ciencia de datos?
NumPy proporciona la matriz N-dimensional y las operaciones vectorizadas en las que se basan la mayoría de las bibliotecas científicas de Python. Los científicos de datos utilizan numpy para tareas científicas de datos como preprocesamiento numérico, álgebra lineal, simulación aleatoria y como formato de intercambio entre pandas, scikit-learn, PyTorch y bibliotecas de trazado. El uso directo es común en tuberías personalizadas; El uso indirecto es universal.
¿NumPy es importante para la ciencia de datos si uso principalmente pandas?
Sí, porque pandas almacena columnas numéricas como matrices NumPy y delega sus matemáticas a NumPy. Comprender los tipos de datos, las vistas frente a las copias y la transmisión explica el rendimiento y el comportamiento de la memoria de la mayoría de los pandas. Puede ser productivo sin escribir NumPy directamente, pero depurará más rápido si comprende la capa subyacente.
¿Debería aprender NumPy o pandas primero?
Aprenda NumPy primero si su trabajo implica simulaciones, señales, imágenes o algoritmos numéricos personalizados. Aprenda pandas primero si su trabajo es análisis tabular con columnas etiquetadas y tipos mixtos. En la práctica, unas pocas horas de NumPy (matrices, indexación, transmisión, reducciones) inmediatamente hacen que los pandas sean menos misteriosos.
¿Qué tan rápido es NumPy en comparación con los bucles puros de Python?
Las operaciones vectorizadas de NumPy normalmente se ejecutan uno o dos órdenes de magnitud más rápido que los bucles equivalentes de Python sobre los mismos datos, porque el bucle interno se ejecuta en C compilado sin sobrecarga del intérprete por elemento. La brecha se reduce o se invierte cuando la operación no se puede vectorizar, cuando las matrices son lo suficientemente pequeñas como para que la sobrecarga de llamada domine o cuando la forma vectorizada asigna temporales grandes.
¿NumPy maneja datos faltantes?
NumPy tiene np.nan para matrices flotantes y np.ma enmascaradas, pero ninguno proporciona semántica de valores perdidos estilo pandas en todos los tipos. Desde NumPy 1.24, np.nan solo es válido para tipos flotantes y complejos, y las matrices de enteros no pueden contenerlo. Para un manejo real de datos faltantes, utilice tipos de pandas que acepten valores NULL o un marco dedicado.
¿Qué cambió en NumPy 2.0 que podría romper mi código?
NumPy 2.0 cambió el entero predeterminado de Windows a int64, adoptó reglas de promoción NEP 50 para que los escalares de Python ya no transmitan matrices y reorganizó la API de C, rompiendo la compatibilidad binaria con extensiones creadas en 1.x. La mayor parte del código de análisis se ejecuta sin cambios, pero el código numérico sensible a la promoción de tipo d debe volver a probarse.
Cree un portafolio de datos, proyecto por proyecto
Rutas de ciencia de datos basadas en proyectos con una terminal guiada y conjuntos de datos reales