HOWTO · NumPy
Come mappare una funzione in NumPy
Applica una funzione Python a ogni valore di un array NumPy con numpy.vectorize() o map() e una lambda. Scopri come funziona ciascun approccio e quando usarlo.
In questa pagina
Per applicare una funzione scalare Python a ogni valore di un array NumPy, puoi racchiuderla con numpy.vectorize() oppure usare map() di Python con una lambda e convertire il risultato in un array. Entrambi gli approcci sono utili per riutilizzare codice scalare; non vanno però confusi con le operazioni native sugli array di NumPy, generalmente preferibili quando è disponibile un’operazione equivalente.
Usare numpy.vectorize() per applicare una funzione elemento per elemento
numpy.vectorize() adatta una funzione che accetta un valore alla volta, così da poterla chiamare con un array. Applica la funzione racchiusa a ogni elemento e restituisce un array di risultati. È comodo quando la logica Python esistente opera su valori scalari e vuoi usarla con dati in forma di array.
L’esempio racchiude una funzione scalare che eleva al quadrato il proprio argomento e poi la applica a cinque numeri interi:
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)
Qui square rimane una normale funzione Python; np.vectorize() fornisce un’interfaccia di chiamata orientata agli array. È un wrapper di praticità, non un’ottimizzazione delle prestazioni: non trasforma la funzione in un’operazione NumPy compilata. Per i calcoli aritmetici già supportati da NumPy, un’espressione come values ** 2 è più semplice e usa direttamente l’operazione sugli array di NumPy. Usa numpy.vectorize() quando adattare la logica scalare rende il codice più chiaro o più facile da riutilizzare.
Usare map() con una funzione lambda
La funzione integrata map() di Python chiama una funzione una volta per ogni elemento di un iterabile. Una lambda è un modo conciso per definire una piccola funzione direttamente nel punto in cui serve. Quando l’input è un array NumPy, map() produce un iteratore di valori trasformati; racchiudi l’iteratore con list() e passa la lista risultante a np.array() per creare un array.
Questo esempio usa una lambda per elevare al quadrato gli stessi valori e poi converte i valori ottenuti con map() in un array 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 lambda riceve separatamente ogni valore dell’array e map() restituisce in sequenza ogni quadrato calcolato. Convertire l’iteratore in una lista lo esaurisce; poi np.array() crea un array a partire da quei valori. Questo approccio è pratico per una breve operazione scalare da affiancare alla chiamata di map(). Per una logica più articolata, definisci una funzione con un nome, così sarà più facile da leggere e mantenere, e passala a map() al posto della lambda.
Scegli numpy.vectorize() quando vuoi un’interfaccia con forma da array per una funzione scalare esistente. Scegli map() con una lambda per una trasformazione breve definita sul momento, soprattutto se ti è utile lavorare con l’iteratore risultante prima di convertirlo. Per operazioni come elevare al quadrato ogni valore, preferisci l’espressione NumPy diretta values ** 2 quando esprime il calcolo desiderato. Queste opzioni descrivono modi diversi di applicare la logica Python; non dimostrano che un approccio di mappatura sia più veloce dell’altro.