Quando si lavora con array, sequenze numeriche o dataset da mescolare, la permutazione random in NumPy è uno degli strumenti più utili da conoscere. In Python, infatti, capita spesso di dover riorganizzare i dati in modo casuale, ad esempio per test, simulazioni, machine learning o semplicemente per cambiare l’ordine degli elementi in un array.
Tra le funzioni più usate troviamo numpy.random.permutation(), che permette di ottenere una versione permutata di una sequenza senza alterare necessariamente l’originale. Accanto a questa, molti sviluppatori alle prime armi incontrano anche random.shuffle(), funzione del modulo standard di Python pensata per mescolare liste in place.
Capire la differenza tra questi due approcci è importante, perché il comportamento cambia in modo concreto: in alcuni casi si ottiene una nuova sequenza casuale, in altri viene modificato direttamente l’oggetto esistente. Questa distinzione, apparentemente piccola, diventa decisiva quando si lavora su codice reale.
In questa guida vedremo in modo semplice come usare permutation() in NumPy, quando può essere più adatto shuffle() di random e quali sono le differenze pratiche tra i due metodi. L’obiettivo è offrirti una spiegazione chiara, leggibile e subito applicabile.
Come usare permutation() di NumPy per mescolare dati e array
La funzione permutation() di NumPy serve a creare una permutazione casuale di una sequenza. Può essere usata sia su un numero intero, per generare una sequenza di indici mescolati, sia su un array, per restituire una copia con ordine casuale.
La sintassi più comune è questa:
import numpy as np
risultato = np.random.permutation(5)
print(risultato)
In questo caso, NumPy genera una permutazione casuale dei numeri da 0 a 4. L’output potrebbe essere diverso a ogni esecuzione, ad esempio:
[2 4 0 1 3]
Questo approccio è particolarmente comodo quando hai bisogno di indici casuali da usare per selezionare o riordinare dati.
Se invece passi un array, permutation() restituisce un nuovo array con gli elementi mescolati:
import numpy as np
array = np.array([10, 20, 30, 40, 50])
mescolato = np.random.permutation(array)
print(array)
print(mescolato)
Un possibile risultato è il seguente:
[10 20 30 40 50]
[30 10 50 20 40]
Come si nota chiaramente, l’array originale non viene modificato. Questo è uno dei vantaggi più apprezzati di NumPy permutation(), soprattutto quando vuoi preservare i dati iniziali.
Un altro caso pratico molto diffuso riguarda gli array multidimensionali. Quando applichi la funzione a una matrice, NumPy mescola lungo il primo asse. In termini semplici, viene cambiato l’ordine delle righe:
import numpy as np
matrice = np.array([[1, 2], [3, 4], [5, 6]])
permutata = np.random.permutation(matrice)
print(permutata)
Un possibile output può essere:
[[5 6]
[1 2]
[3 4]]
Questo comportamento è molto utile quando si gestiscono dataset tabellari, perché consente di mescolare le osservazioni mantenendo intatta la struttura interna di ogni riga.
Se vuoi ottenere risultati riproducibili, ad esempio durante esercizi o test, puoi impostare un seed casuale:
import numpy as np
np.random.seed(42)
print(np.random.permutation(6))
Usare un seed significa poter ottenere la stessa permutazione a ogni esecuzione, a parità di contesto. È una pratica molto diffusa quando si desidera un comportamento prevedibile durante lo sviluppo.
Guida pratica all’uso di shuffle() del modulo random in Python
Oltre a NumPy, Python mette a disposizione anche la funzione shuffle() del modulo random. Questa funzione viene spesso usata per mescolare liste tradizionali Python in modo rapido e immediato.
La sintassi base è molto semplice:
import random
numeri = [1, 2, 3, 4, 5]
random.shuffle(numeri)
print(numeri)
Dopo l’esecuzione, la lista originale viene riorganizzata casualmente. Ad esempio:
[4, 1, 5, 3, 2]
La caratteristica fondamentale da ricordare è che shuffle() modifica direttamente la lista originale. Questo comportamento viene definito in place. In pratica, non viene creata una nuova lista mescolata: viene alterata quella esistente.
Per chi è agli inizi, questo dettaglio è cruciale. Se hai bisogno di conservare la sequenza iniziale, conviene creare prima una copia:
import random
valori = [10, 20, 30, 40]
copia = valori.copy()
random.shuffle(copia)
print(valori)
print(copia)
In questo esempio, valori rimane invariata, mentre copia viene mescolata. È una soluzione semplice ma molto efficace quando non vuoi perdere l’ordine originale dei dati.
Va anche detto che random.shuffle() è pensato soprattutto per le liste Python, mentre in presenza di array numerici o strutture tipiche dell’elaborazione scientifica è generalmente più naturale usare NumPy.
Differenze tra permutation() e shuffle(): quale metodo scegliere
Arriviamo al punto più importante: che differenza c’è tra permutation() e shuffle()? Anche se entrambe le funzioni servono a mescolare elementi, il loro funzionamento non è identico e la scelta dipende dal tipo di dato con cui stai lavorando e dal risultato che vuoi ottenere.
Permutation() crea una nuova sequenza casuale
Con numpy.random.permutation(), ottieni una nuova sequenza permutata. L’oggetto originale, salvo casi particolari di gestione successiva, resta invariato. Questo è molto utile quando vuoi lavorare su una copia casuale dei dati.
import numpy as np
dati = np.array([1, 2, 3, 4])
nuovi_dati = np.random.permutation(dati)
print(dati)
print(nuovi_dati)
Qui il vantaggio è evidente: puoi confrontare facilmente l’ordine originale con quello mescolato.
Shuffle() rimescola i dati originali direttamente
Con random.shuffle(), invece, la sequenza viene modificata sul posto. È una scelta adatta quando non ti interessa mantenere l’ordine iniziale e vuoi un’operazione diretta.
import random
dati = [1, 2, 3, 4]
random.shuffle(dati)
print(dati)
Questo approccio è rapido, ma richiede attenzione. Se non hai creato una copia, i dati originali non saranno più disponibili nel loro ordine di partenza.
NumPy e random lavorano bene in contesti diversi
Un’altra differenza sostanziale riguarda il contesto d’uso. NumPy permutation() è ideale per array numerici, matrici e attività legate al calcolo scientifico o all’analisi dati. random.shuffle(), invece, si integra bene nelle operazioni più generiche su liste Python.
Se stai lavorando con dataset, indici, tensori leggeri o strutture numeriche, NumPy offre in genere un approccio più coerente. Se invece devi solo mescolare rapidamente una lista di valori, shuffle() resta una soluzione pratica e immediata.
Tabella rapida di confronto tra permutation() e shuffle()
Ecco una sintesi semplice delle differenze principali:
- numpy.random.permutation(): restituisce una nuova sequenza mescolata
- random.shuffle(): modifica la sequenza originale
- permutation(): molto adatto agli array NumPy
- shuffle(): ideale per liste Python
- permutation(): può lavorare anche con un intero per creare indici casuali
- shuffle(): lavora direttamente sulla sequenza esistente
In termini pratici, se vuoi preservare i dati originali, scegli quasi sempre permutation(). Se invece desideri mescolare una lista al volo senza creare copie, allora shuffle() è perfetto.
Conoscere bene questa distinzione ti aiuta a scrivere codice più pulito, prevedibile e adatto al contesto in cui stai operando. È proprio in queste piccole scelte che si vede una comprensione concreta di Python e delle sue librerie più usate.
In conclusione, la permutazione random NumPy è uno strumento semplice ma estremamente versatile. Imparare a usare numpy.random.permutation() ti permette di gestire meglio array e dataset, mentre comprendere il comportamento di random.shuffle() ti aiuta a evitare errori comuni nella manipolazione delle sequenze. Per chi inizia, questa è una distinzione preziosa; per chi scrive codice ogni giorno, è una base operativa essenziale.