Las reducciones (o agregaciones) son una familia de funciones de NumPy que operan sobre un array devolviendo un resultado con menos dimensiones.
Muchas de estas funciones realizan operaciones estadísticas típicas en arrays, mientras que otras realizan reducciones de dimensionalidad.
En este artículo, aprenderemos sobre algunas de las agregaciones más comunes, pero antes de empezar crearemos un par de arrays para ilustrar la funcionalidad.
¡Hagamos eso y empecemos a usar reducciones!
# Creemos un array pequeño 1-d para verificar algunas funciones básicas
import numpy as np
arr = np.random.randint(-10, 10, 10)
print(arr)
[-9 9 8 7 3 6 3 3 -7 9]
# También usaremos un array 2-d para mostrar las capacidades de reducción de dimensión de las agregaciones
arr2 = np.random.randint(-10, 10, 16).reshape(4,4)
print(arr2)
[[ -7 -8 -1 -7]
[ 1 0 -6 3]
[ 7 -10 -8 -2]
[ 0 -7 3 -8]]
1 dimensión, muchas dimensiones
Muchas reducciones te permiten especificar un eje como argumento que indica la dirección en la que se aplicará la operación. Esto, por supuesto, es mucho más fácil de entender con un ejemplo:
Usaremos la función sum, que como ya sabes, realiza la suma de elementos en un array.
# El escenario unidimensional tiene el comportamiento más obvio:
# Devuelve un solo número con el valor de la suma de cada elemento en el array:
result = arr.sum()
print(result)
32
# Ahora, si lo usamos en un array con más dimensiones, aún devolverá un solo número
# con el valor de la suma de cada elemento
result = arr2.sum()
print(result)
-50
Ahora, se vuelve un poco diferente si proporcionamos un axis. Este parámetro especifica el eje (o ejes) a lo largo del cual se realiza la operación. El valor por defecto (None) en este caso simplemente sumará todos los elementos, pero también podemos especificar si queremos sumar a lo largo de filas, columnas o ejes de dimensiones superiores.
# Sumar los contenidos a lo largo de cada fila (axis=0)
result = arr2.sum(axis=0)
print(result)
[ 1 -25 -12 -14]
# Sumar los contenidos a lo largo de cada columna (axis=1)
result = arr2.sum(axis=1)
print(result)
[-23 -2 -13 -12]
Me tomó un tiempo entender qué significa realizar una operación a lo largo de un eje. La forma más fácil que encontré para explicarlo es así:
Toma cada enésimo elemento de los ejes que estás usando y realiza la operación.
En el primer caso (axis=0) esto significa que sumarás los enésimos elementos de cada fila. Puedes verlo en código reemplazando el selector con el símbolo : y ver los resultados
# Sum(axis=0) primera entrada será producida tomando esto
sub_arr = arr2[:,0]
print(sub_arr)
# Y llamando sum sobre él
print(sub_arr.sum())
[-7 1 7 0]
1
# Sum(axis=0) segunda entrada será producida tomando esto
sub_arr = arr2[:,1] # Estamos sumando a lo largo de filas, así que mantén eso como : y cambia la columna
print(sub_arr)
# Y llamando sum sobre él
print(sub_arr.sum())
[ -8 0 -10 -7]
-25
Ahora entiendes por qué el resultado es [ 1 -25 -12 -14]
. Si aún tienes problemas entendiendo qué significa realizar una operación a lo largo de un eje, repite el ejemplo que acabamos de escribir pero pon el símbolo : en el selector de columna. Si lo entendiste, prueba un array tridimensional y ve cómo funciona esto, como bonus, ¡puedes proporcionar tuplas cuando realizas reducción de dimensionalidad!
Ahora que entendemos este asunto de los ejes podemos continuar con otras funciones!
# mean calcula la media aritmética a lo largo de un eje especificado
result = np.mean(arr)
print(result)
3.2
# median calcula la mediana a lo largo del eje especificado
result = np.median(arr)
print(result)
4.5
# average calcula el promedio ponderado a lo largo de un eje especificado
result = np.average(arr)
print(result)
3.2
# std calcula la desviación estándar (sí, sí, eje eje eje)
result = np.std(arr)
print(result)
6.046486583132388
# var calcula la varianza, y sí, a lo largo de un eje especificado
result = np.var(arr)
print(result)
36.55999999999999
# amin devuelve el mínimo de un array o mínimo a lo largo de un eje
result = np.amin(arr)
print(result)
-9
# amax devuelve el máximo de un array o máximo a lo largo de un eje
result = np.amax(arr)
print(result)
9
La mayoría de estos métodos también tienen variantes que ignoran valores NaN en el array. Por ejemplo, amin tiene nanmin, mean tiene nanmean, y así sucesivamente…
Rápido, conciso, limpio
Las reducciones de NumPy están entre algunas de sus características más útiles. Saber cómo usarlas forma parte de la base para análisis de datos más avanzado y reducción de dimensionalidad. Este artículo solo describe algunas funciones comunes, pero hay muchas cosas geniales ya implementadas para ti. Puedes encontrar más funciones estadísticas y matemáticas en estos lugares:
Echa un vistazo a la documentación y juega con las funciones.
Genial, casi terminamos con los fundamentos de NumPy. El siguiente artículo será el último, y cubrirá las utilidades de álgebra lineal de NumPy, ¡nos vemos ahí!
¡Gracias por leer!
Qué hacer después
- Comparte este artículo con amigos y colegas. Gracias por ayudarme a llegar a personas que podrían encontrar esta información útil.
- Puedes encontrar el código fuente para esta serie en este repo.
- Este artículo está basado en el libro: Python for Data Analysis.
- Envíame un email con preguntas, comentarios o sugerencias (está en la página Autor)