Quando si lavora con NumPy, una delle necessità più frequenti è cercare valori dentro un array, individuare posizioni specifiche oppure capire dove inserire un elemento mantenendo l’ordine. Per chi inizia con Python e con il calcolo numerico, queste operazioni possono sembrare complesse, ma in realtà NumPy mette a disposizione strumenti molto pratici, rapidi e intuitivi.
In questa guida vedremo come effettuare la ricerca in un array NumPy usando due funzioni molto utili: np.where() e np.searchsorted(). La prima è ideale quando vuoi cercare elementi che rispettano una condizione; la seconda, invece, è perfetta quando stai lavorando con array ordinati e vuoi sapere in quale posizione si trova o andrebbe inserito un valore.
Capire bene queste funzioni è importante non solo per scrivere codice più pulito, ma anche per migliorare l’efficienza delle elaborazioni. NumPy, infatti, è progettato per lavorare su grandi quantità di dati in modo molto più veloce rispetto alle liste Python tradizionali.
Come usare np.where per cercare valori con condizioni
La funzione np.where() è tra le più usate quando si vuole effettuare una ricerca condizionale in un array NumPy. In pratica, permette di trovare gli indici degli elementi che soddisfano una certa regola, ad esempio tutti i numeri maggiori di 10, uguali a un valore specifico oppure compresi in un intervallo.
Vediamo un primo esempio semplice:
import numpy as np
numeri = np.array(
{
4, 8, 15, 16, 23, 42
}
)
indici = np.where(
numeri > 15
)
print(
indici
)
In questo caso, np.where() restituisce gli indici degli elementi maggiori di 15. Non ritorna direttamente i valori, ma la loro posizione all’interno dell’array.
Se vuoi ottenere anche i valori trovati, puoi usare gli indici restituiti per selezionarli:
import numpy as np
numeri = np.array(
{
4, 8, 15, 16, 23, 42
}
)
indici = np.where(
numeri > 15
)
valori = numeri[indici]
print(
valori
)
Questo approccio è molto comodo perché ti permette di separare la fase di ricerca da quella di estrazione dei dati. È una logica semplice, ma estremamente utile anche in casi più avanzati.
Esempi pratici di ricerca con np.where negli array NumPy
Una situazione comune riguarda la ricerca di un valore preciso. Per esempio, se vuoi sapere dove compare il numero 23:
import numpy as np
numeri = np.array(
{
4, 8, 15, 16, 23, 42
}
)
indice = np.where(
numeri == 23
)
print(
indice
)
Puoi anche combinare più condizioni. Questo è particolarmente utile quando hai bisogno di filtrare un array in modo più raffinato:
import numpy as np
numeri = np.array(
{
4, 8, 15, 16, 23, 42
}
)
indici = np.where(
(numeri > 10) & (numeri < 30)
)
print(
indici
)
Qui vengono cercati tutti gli elementi maggiori di 10 e minori di 30. L’uso delle parentesi è importante, perché rende la condizione leggibile e corretta dal punto di vista sintattico.
Un altro aspetto interessante di np.where() è che può essere usato anche per sostituire valori in base a una condizione. Anche se non è una ricerca pura, è una funzione strettamente collegata allo stesso concetto operativo:
import numpy as np
numeri = np.array(
{
4, 8, 15, 16, 23, 42
}
)
risultato = np.where(
numeri > 15,
"alto",
"basso"
)
print(
risultato
)
In questo esempio, ogni valore viene etichettato come “alto” o “basso” in base alla condizione indicata. È una tecnica molto diffusa nell’analisi dei dati, soprattutto quando si lavora con classificazioni semplici.
Come funziona np.searchsorted per la ricerca in array ordinati
La funzione np.searchsorted() è pensata per un contesto diverso. Qui non si cerca semplicemente se un valore esiste, ma si vuole sapere in quale posizione si trova o dovrebbe essere inserito in un array ordinato. È quindi uno strumento molto utile quando devi mantenere una sequenza in ordine crescente.
Ecco un esempio di base:
import numpy as np
numeri = np.array(
{
5, 10, 15, 20, 25
}
)
posizione = np.searchsorted(
numeri,
15
)
print(
posizione
)
Se il valore è presente, NumPy restituisce la posizione in cui lo trova. Se invece il valore non è presente, restituisce l’indice in cui andrebbe inserito per mantenere l’ordinamento.
Per esempio:
import numpy as np
numeri = np.array(
{
5, 10, 15, 20, 25
}
)
posizione = np.searchsorted(
numeri,
18
)
print(
posizione
)
In questo caso, il numero 18 non è presente, ma dovrebbe essere inserito prima di 20. Per questo la funzione restituisce l’indice corrispondente a quella posizione.
Ricerca ordinata con np.searchsorted: esempi utili per capire meglio
Una caratteristica molto utile di np.searchsorted() è il parametro side, che permette di scegliere come comportarsi in presenza di valori duplicati. Puoi decidere se ottenere la prima posizione utile oppure quella successiva all’ultimo duplicato.
import numpy as np
numeri = np.array(
{
5, 10, 10, 10, 20
}
)
sinistra = np.searchsorted(
numeri,
10,
side = "left"
)
destra = np.searchsorted(
numeri,
10,
side = "right"
)
print(
sinistra
)
print(
destra
)
Con side=”left” ottieni la prima posizione disponibile del valore, mentre con side=”right” ricevi la posizione immediatamente successiva all’ultimo elemento uguale. Questo comportamento è molto pratico quando si gestiscono dati ripetuti o intervalli.
È bene ricordare un punto fondamentale: np.searchsorted() funziona correttamente solo se l’array è già ordinato. Se i dati non sono in ordine crescente, il risultato può essere fuorviante. In un flusso di lavoro reale, conviene sempre verificare o ordinare l’array prima di usare questa funzione.
import numpy as np
numeri = np.array(
{
20, 5, 15, 10
}
)
ordinati = np.sort(
numeri
)
posizione = np.searchsorted(
ordinati,
12
)
print(
ordinati
)
print(
posizione
)
Questo piccolo passaggio aggiuntivo rende la ricerca molto più affidabile e ti evita errori difficili da notare, soprattutto quando lavori su dataset più ampi.