Algoritmos de Vectores y Operaciones Vectoriales en Python
Introducción
Los vectores son la piedra angular de la mayoría de los algoritmos de ciencia de datos, gráficos por computadora y simulaciones físicas. En este artículo desglosamos los conceptos matemáticos, presentamos implementaciones en Python y comparamos las principales bibliotecas para que elijas la que mejor se adapte a tu caso de uso.
Conceptos Básicos
- Vector: entidad ordenada de n componentes (x₁, x₂, …, xₙ).
- Dimensión: número de componentes del vector.
- Espacio vectorial: conjunto cerrado bajo suma y producto escalar.
Operaciones Vectoriales Fundamentales
- Suma y resta de vectores.
- Producto escalar (dot product).
- Producto cruzado (solo en 3D).
- Norma (longitud) y normalización.
- Ángulo entre vectores.
- Proyección de un vector sobre otro.
Implementación en Python
Existen varias formas de trabajar con vectores en Python. A continuación se presentan tres enfoques populares.
1️⃣ Pure Python (listas)
def suma(v1, v2):
return [a + b for a, b in zip(v1, v2)]
v1 = [1, 2, 3]
v2 = [4, 5, 6]
print('Suma:', suma(v1, v2)) # → [5, 7, 9]
Ventajas: sin dependencias externas.
Desventajas: rendimiento pobre y falta de operaciones avanzadas.
2️⃣ NumPy (de‑facto estándar)
import numpy as np
v1 = np.array([1, 2, 3])
v2 = np.array([4, 5, 6])
# Suma y resta
print('Suma:', v1 + v2)
print('Resta:', v1 - v2)
# Producto escalar
print('Dot:', np.dot(v1, v2))
# Norma y normalización
norm = np.linalg.norm(v1)
print('Norma:', norm)
print('Normalizado:', v1 / norm)
Ventajas: operaciones vectorizadas en C, amplio ecosistema.
Desventajas: dependencia externa, consumo de memoria mayor que listas simples.
3️⃣ PyTorch (para GPU)
import torch
v1 = torch.tensor([1., 2., 3.])
v2 = torch.tensor([4., 5., 6.])
# Operaciones en GPU (si está disponible)
if torch.cuda.is_available():
v1 = v1.cuda()
v2 = v2.cuda()
print('Dot (GPU):', torch.dot(v1, v2))
print('Cross:', torch.cross(v1, v2))
Ventajas: aceleración por GPU, autograd para entrenamiento de modelos.
Desventajas: sobrecarga para tareas triviales, API más pesada.
Comparativa rápida
| Característica | Pure Python | NumPy | PyTorch |
|---|---|---|---|
| Velocidad (operaciones básicas) | ⏱️ lenta | ⚡ rápida (CPU) | 🚀 ultra‑rápida (GPU) |
| Facilidad de uso | 🟢 alta | 🟡 media | 🟠 media‑alta |
| Soporte GPU | ❌ | ✅ (cuCuPy) | ✅ |
| Comunidad & Docs | 🟢 | 🟢🟢🟢 | 🟢🟢 |
Casos de Uso del Mundo Real
- Machine Learning: Representación de características, embeddings y cálculo de similitud coseno.
- Gráficos 3D: Transformaciones de vértices, cálculo de normales mediante productos cruzados.
- Simulación Física: Cálculo de fuerzas, velocidades y aceleraciones usando normas y proyecciones.
- Procesamiento de Señales: Filtrado FIR/IIR mediante convoluciones vectoriales.
Rendimiento, Escalabilidad y Buenas Prácticas
- Usa siempre
numpy.ndarrayotorch.Tensorpara operaciones masivas. Evita bucles Python nativos. - Pre‑aloca memoria. Cuando procesas millones de vectores, crea el array completo con
np.empty(shape, dtype)en lugar de concatenar. - Batching. Agrupa vectores en batches para aprovechar paralelismo SIMD/CUDA.
- Tipos de datos. Usa
float32en GPU para reducir consumo de memoria sin perder precisión significativa. - Profiling. Utiliza
cProfile,line_profilerotorch.utils.benchmarkpara identificar cuellos de botella.
Resolución de Problemas Comunes (Troubleshooting)
- Dimensiones incompatibles: siempre verifica
v1.shape == v2.shapeantes de operar. - Precision loss en GPU: si notas diferencias entre CPU y GPU, fuerza
torch.set_default_dtype(torch.float64)o conviértelo afloat64temporalmente. - MemoryError en NumPy: usa
np.memmapo divide el dataset en bloques. - Errores de broadcasting: revisa reglas de broadcasting de NumPy; agrega dimensiones con
np.expand_dimssi es necesario.
Seguridad y Validación de Datos
Cuando los vectores provienen de fuentes externas (API, archivos CSV, sensores), valida siempre:
def validar_vector(v, dim):
if not isinstance(v, (list, np.ndarray, torch.Tensor)):
raise TypeError('Vector debe ser lista o array')
if len(v) != dim:
raise ValueError(f'Longitud esperada {dim}, recibida {len(v)}')
return np.asarray(v, dtype=np.float64)
Esto previene inyecciones de código o desbordamientos de memoria.
Conclusiones
Dominar los algoritmos de vectores y sus operaciones es esencial para cualquier profesional de datos o ingeniero de software. Con Python y sus ecosistemas (NumPy, SciPy, PyTorch) puedes implementar soluciones que escalen desde prototipos rápidos hasta sistemas de producción que procesen miles de millones de vectores por segundo.
Recuerda siempre medir, validar y elegir la herramienta adecuada según la carga de trabajo y los recursos disponibles.
Algoritmos de Vectores y Operaciones Vectoriales en Python: Guía Completa con Ejemplos Prácticos