Si trabajas con datos numéricos en Python y quieres aplicar operaciones a miles de elementos sin escribir un solo bucle, broadcasting en NumPy es la herramienta que necesitas. Aquí verás cómo aplicar descuentos, sumar valores, comparar elementos y reorganizar arrays con métodos como concatenate, stack y split.
¿Qué es broadcasting en NumPy y por qué importa?
El broadcasting es la funcionalidad que permite a NumPy realizar operaciones aritméticas entre arrays de diferente tamaño y forma sin duplicar datos en memoria [0:25].
En lugar de iterar elemento por elemento, NumPy extiende implícitamente el array más pequeño para que coincida con el más grande. El resultado: operaciones elementales rápidas y código más limpio.
¿Qué hace el broadcasting? Permite operar arrays de distintas dimensiones tratando al más pequeño como si tuviera la forma del más grande, sin copiar datos.
¿Cómo aplicar un descuento a un array de precios?
Imagina un array de precios [100, 200, 300] y un descuento 0.9. Al multiplicar ambos, NumPy aplica el escalar a cada elemento del array [1:10]:
python
import numpy as np
prices = np.array([100, 200, 300])
discount = 0.9
prices_with_discount = prices * discount
print(prices_with_discount)
[ 90. 180. 270.]
El 90% de 100 es 90, el de 200 es 180, y así sucesivamente. NumPy entrega los valores con decimales porque el descuento es flotante.
¿Cómo se comporta broadcasting con arrays de diferente forma?
Cuando el array secundario tiene más de un valor, NumPy alinea las dimensiones compatibles. Por ejemplo, sumar un array de tres elementos a una matriz 3x3 aplica esos valores fila por fila [2:30]:
python
prices = np.random.randint(100, 500, (3, 3))
discount = np.array([10, 20, 30])
result = prices + discount
A cada fila se le suma 10 al primer elemento, 20 al segundo y 30 al tercero. Pruébalo modificando la longitud del array de descuentos y observa cuándo NumPy lanza error por incompatibilidad de formas.
¿Cómo hacer operaciones lógicas sobre arrays?
NumPy incluye métodos para evaluar condiciones sobre todos o algunos elementos de un array [4:15].
np.all(array > 0) devuelve True solo si todos los elementos cumplen la condición.
np.any(array > 4) devuelve True si al menos uno la cumple.
- Las comparaciones funcionan con cualquier operador: mayor, menor, igualdad.
python
arr = np.array([1, 2, 3, 4, 5])
print(np.all(arr > 0)) # True
print(np.all(arr > 9)) # False
print(np.any(arr > 4)) # True
Estas operaciones son útiles para validar datasets antes de procesarlos: ¿hay valores negativos? ¿algún outlier supera un umbral?
¿Cuál es la diferencia entre all y any? all exige que todos los elementos cumplan la condición; any solo requiere que uno la cumpla.
¿Cómo concatenar, apilar y dividir arrays en NumPy?
Más allá de las operaciones aritméticas, NumPy ofrece tres métodos clave para reorganizar la estructura de tus datos: concatenate, stack y split [5:40].
¿Qué hace np.concatenate y cómo se usa?
La concatenación une dos o más arrays en uno solo a lo largo de un eje:
python
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])
concatenated = np.concatenate((A, B))
[1 2 3 4 5 6]
Si pasas el mismo array dos veces, obtienes la duplicación de sus elementos. El orden de los argumentos define el orden del resultado.
¿Cuándo usar vstack y hstack?
El stacking apila arrays generando una nueva dimensión [7:20]:
np.vstack((A, B)) apila los arrays verticalmente, creando una matriz con cada array como fila.
np.hstack((A, B)) los une horizontalmente, equivalente a la concatenación en una sola fila.
python
np.vstack((A, B))
[[1 2 3]
[4 5 6]]
np.hstack((A, B))
[1 2 3 4 5 6]
La diferencia con concatenate es semántica: stack enfatiza la idea de apilar y puede agregar dimensiones, mientras que concatenate trabaja sobre ejes existentes.
¿Cómo dividir un array con np.split?
Cuando necesitas partir un array grande en bloques iguales, split es tu aliado [9:00]:
python
C = np.arange(1, 10)
np.split(C, 3)
[array([1, 2, 3]), array([4, 5, 6]), array([7, 8, 9])]
El segundo argumento indica en cuántas porciones dividir el array. Si los elementos no son divisibles exactamente, NumPy lanza un error, así que verifica la longitud antes de partirlo.
Conceptos y métodos clave para dominar arrays
Estos son los elementos que aparecen en la práctica y conviene tener a mano:
- Broadcasting: extensión implícita de arrays para operaciones entre formas distintas [0:25].
- np.array: creación de arrays a partir de listas de Python.
- np.random.randint(low, high, shape): generación de matrices con enteros aleatorios [2:00].
- np.all y np.any: evaluación lógica global o parcial sobre arrays [4:30].
- np.concatenate: unión de arrays a lo largo de un eje existente [6:00].
- np.vstack y np.hstack: apilamiento vertical y horizontal [7:30].
- np.split: división en sub arrays de igual tamaño [9:10].
Un buen ejercicio: prueba a cambiar la dimensionalidad de los arrays en cada ejemplo y observa cómo varían los resultados. ¿Qué pasa si intentas un vstack con arrays de diferente longitud? Cuéntalo en los comentarios.