HOWTO · NumPy

Cómo mapear una función en NumPy

Aplica una función de Python a cada valor de un array de NumPy con numpy.vectorize() o map() y una lambda. Descubre cómo funciona cada enfoque y cuándo usarlo.

En esta página

Para aplicar una función escalar de Python a cada valor de un array de NumPy, puedes envolverla con numpy.vectorize() o usar map() de Python con una función lambda y convertir el resultado en un array. Ambos métodos son útiles para reutilizar lógica escalar; ninguno debe confundirse con las operaciones nativas de arrays de NumPy, que suelen ser la mejor opción cuando existe una operación equivalente.

Usar numpy.vectorize() para aplicar una función elemento a elemento

numpy.vectorize() adapta una función que recibe un valor cada vez para que puedas llamarla con un array. Aplica la función envolvente a cada elemento y devuelve un array con los resultados. Es práctico cuando tienes lógica de Python escrita para valores escalares y quieres usarla con datos en forma de array.

En el ejemplo, se envuelve una función escalar que eleva su entrada al cuadrado y luego se aplica a cinco números enteros:

import numpy as np

def square(value):
    return value ** 2

values = np.array([1, 2, 3, 4, 5])
square_each = np.vectorize(square)
result = square_each(values)

print(result)

Aquí, square sigue siendo una función normal de Python; np.vectorize() proporciona una interfaz de llamada que acepta arrays. Es una envoltura de conveniencia, no una optimización del rendimiento: no convierte la función en una operación compilada de NumPy. Para los cálculos aritméticos que NumPy ya admite, una expresión como values ** 2 es más sencilla y usa directamente una operación de arrays de NumPy. Usa numpy.vectorize() cuando adaptar la lógica escalar haga que el código sea más claro o fácil de reutilizar.

Usar map() con una función lambda

La función integrada map() de Python llama a otra función una vez por cada elemento de un iterable. lambda permite definir de forma concisa una función pequeña en línea. Si la entrada es un array de NumPy, map() produce un iterador con los valores transformados; puedes envolver ese iterador con list() y pasar la lista resultante a np.array() para crear un array.

En este ejemplo, una función lambda eleva al cuadrado los mismos valores y luego convierte los valores obtenidos con map() en un array de NumPy:

import numpy as np

values = np.array([1, 2, 3, 4, 5])
mapped_values = map(lambda value: value ** 2, values)
result = np.array(list(mapped_values))

print(result)

La función lambda recibe por separado cada valor del array, y map() va produciendo cada cuadrado en orden. Al convertir el iterador en una lista, se consumen sus elementos; después, np.array() crea un array a partir de esos valores. Este método resulta práctico para una operación escalar breve que conviene escribir junto a la llamada a map(). Si la lógica es más extensa, define una función con nombre para que sea más fácil de leer y mantener, y pásala a map() en lugar de usar lambda.

Elige numpy.vectorize() si quieres una interfaz que acepte arrays para una función escalar existente. Elige map() con una función lambda para una transformación pequeña en línea, especialmente si te resulta útil trabajar con el iterador antes de convertirlo. Para operaciones como elevar todos los valores al cuadrado, prefiere la expresión directa de NumPy values ** 2 cuando represente el cálculo que necesitas. Estas opciones describen distintas maneras de aplicar lógica de Python; no demuestran que un método de mapeo sea más rápido que otro.