HOWTO · NumPy

Comment mapper une fonction dans NumPy

Appliquez une fonction Python à chaque valeur d'un tableau NumPy avec numpy.vectorize() ou map() et une lambda. Découvrez comment fonctionne chaque approche et quand l'utiliser.

Sur cette page

Pour appliquer une fonction Python scalaire à chaque valeur d’un tableau NumPy, vous pouvez l’encapsuler avec numpy.vectorize() ou utiliser map() en Python avec une fonction lambda, puis convertir le résultat en tableau. Ces deux méthodes sont utiles pour réutiliser une logique scalaire. Elles ne remplacent pas les opérations natives sur les tableaux NumPy, généralement préférables lorsqu’une opération équivalente existe.

Utiliser numpy.vectorize() pour appliquer une fonction élément par élément

numpy.vectorize() adapte une fonction qui accepte une valeur à la fois afin que vous puissiez l’appeler avec un tableau. La fonction encapsulée est appliquée à chaque élément, et le résultat est un tableau de valeurs. Cette méthode est pratique lorsque votre code Python existant traite des valeurs scalaires et que vous souhaitez l’utiliser avec des données sous forme de tableau.

L’exemple encapsule une fonction scalaire qui élève son argument au carré, puis l’applique à cinq entiers :

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)

Ici, square reste une fonction Python ordinaire ; np.vectorize() fournit une interface qui permet de l’appeler avec un tableau. C’est un adaptateur pratique, pas une optimisation des performances : il ne transforme pas la fonction en opération NumPy compilée. Pour les calculs arithmétiques déjà pris en charge par NumPy, une expression comme values ** 2 est plus simple et utilise directement l’opération sur les tableaux de NumPy. Utilisez numpy.vectorize() lorsque l’adaptation d’une logique scalaire rend le code plus clair ou plus facile à réutiliser.

Utiliser map() avec une fonction lambda

La fonction intégrée map() de Python appelle une fonction une fois pour chaque élément d’un itérable. Une fonction lambda permet de définir brièvement une petite fonction directement à l’endroit où elle est utilisée. Avec un tableau NumPy en entrée, map() produit un itérateur de valeurs transformées ; encapsulez cet itérateur dans list(), puis transmettez la liste obtenue à np.array() pour créer un tableau.

Dans cet exemple, une fonction lambda élève les mêmes valeurs au carré, puis les valeurs obtenues sont converties en tableau 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 fonction lambda reçoit séparément chaque valeur du tableau, et map() fournit successivement les carrés obtenus. La conversion de l’itérateur en liste le consomme ; np.array() crée ensuite un tableau à partir de ces valeurs. Cette méthode convient à une courte opération scalaire placée près de l’appel à map(). Pour une logique plus longue, définissez une fonction nommée, plus facile à lire et à maintenir, puis transmettez-la à map() à la place de la fonction lambda.

Choisissez numpy.vectorize() pour fournir une interface adaptée aux tableaux à une fonction scalaire existante. Choisissez map() avec une fonction lambda pour une petite transformation définie sur place, notamment si l’itérateur obtenu vous est utile avant sa conversion. Pour des opérations comme élever chaque valeur au carré, préférez l’expression NumPy directe values ** 2 lorsqu’elle correspond au calcul souhaité. Ces méthodes décrivent différentes façons d’appliquer une logique Python ; elles ne permettent pas de conclure que l’une est plus rapide que l’autre.