HOWTO · NumPy
NumPy Shuffle Two Array
Ci sono tre metodi principali che possono essere usati per mescolare due array corrispondenti in Python, la funzione sklearn.utils.shuffle(), la funzione numpy.random.shuffle() e la funzione numpy.random.permutation().
In questa pagina
Mescolare due array correlati significa cambiarne insieme l’ordine delle righe. Se la riga i di un array descrive la riga i di un altro, per esempio una riga di caratteristiche e la relativa etichetta, entrambi gli array devono usare la stessa permutazione. Mescolarli separatamente interrompe questa corrispondenza. Gli esempi qui sotto usano un array di caratteristiche a due colonne e un array di etichette; i valori corrispondenti in ogni riga rendono visibile l’allineamento.
Mescolare due array mantenendo allineate le righe corrispondenti
Applica lo stesso ordine di righe a entrambi gli array. La prima dimensione deve avere la stessa lunghezza in ciascun input. Per gli array con più colonne, l’ordine condiviso seleziona righe intere, mantenendo insieme i valori di ogni riga.
Esegui questo esempio con un ordine fisso, così sarà facile verificare la corrispondenza tra la riga delle caratteristiche e l’etichetta:
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
import numpy as np
features = np.array([[10, 100], [20, 200], [30, 300]])
labels = np.array([1, 2, 3])
order = np.array([2, 0, 1])
print(features[order])
print(labels[order])
[[ 30 300]
[ 10 100]
[ 20 200]]
[3 1 2]
L’ordine fisso serve solo a illustrare il meccanismo; quando vuoi ottenere una disposizione casuale, usa un ordine generato con uno dei metodi descritti qui sotto.
Usare sklearn.utils.shuffle()
sklearn.utils.shuffle() accetta più array e applica a tutti lo stesso ordinamento, restituendo array mescolati da assegnare. Se scikit-learn è installato, importa prima la funzione con from sklearn.utils import shuffle, poi chiama features_shuffled, labels_shuffled = shuffle(features, labels). Passa alla funzione tutti gli array correlati nella stessa chiamata: le righe risultanti restano abbinate. Questo approccio è comodo quando scikit-learn fa già parte del progetto. L’ordine casuale può variare da una chiamata all’altra e la funzione restituisce risultati da assegnare, senza riordinare in-place gli array originali.
L’importazione e la chiamata richiedono scikit-learn, che non è disponibile in tutti gli ambienti Python. Se è installato, esegui l’importazione prima della chiamata e assegna entrambi gli array restituiti. Questa chiamata specifica per la dipendenza è mostrata come sintassi, non come esempio eseguito; le sezioni con NumPy qui sotto mostrano alternative eseguibili senza scikit-learn.
Usare una permutazione condivisa con NumPy
numpy.random.permutation(features.shape[0]) crea una sequenza mescolata di indici di riga. Assegnala a order, poi seleziona features[order] e labels[order]. L’indicizzazione avanzata di NumPy produce risultati indicizzati e lascia gli array originali nel loro ordine. Conserva order per riutilizzare esattamente questa disposizione, applicarla ad altri array o salvarla insieme ai dati per usarla in seguito. Generare e conservare l’ordine degli indici evita anche di dipendere da una particolare interfaccia per lo stato casuale.
Qui un unico ordine generato indicizza entrambi gli array. L’ordine delle righe stampate varia, ma le coppie di caratteristiche ed etichette restano abbinate:
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
import numpy as np
features = np.array([[10, 100], [20, 200], [30, 300]])
labels = np.array([1, 2, 3])
order = np.random.permutation(features.shape[0])
features_shuffled = features[order]
labels_shuffled = labels[order]
print(features_shuffled)
print(labels_shuffled)
Mescolare un array di indici condiviso con NumPy
numpy.random.shuffle() modifica in-place la sequenza ricevuta. Crea un array di indici con order = np.arange(features.shape[0]), mescola quell’array con np.random.shuffle(order) e seleziona entrambe le sorgenti con features[order] e labels[order]. In questo modo i dati originali restano intatti e l’ordine delle righe è esplicito. Lo stesso approccio funziona anche con altri array: indicizza ogni array allineato usando gli stessi indici mescolati. Solo order viene modificato in-place; i risultati dell’indicizzazione sono array separati. Conserva una copia di order se altro codice potrebbe modificarlo e vuoi mantenere questa disposizione.
Questo esempio modifica solo order; entrambi gli array sorgente vengono indicizzati usando la stessa sequenza mescolata:
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
import numpy as np
features = np.array([[10, 100], [20, 200], [30, 300]])
labels = np.array([1, 2, 3])
order = np.arange(features.shape[0])
np.random.shuffle(order)
features_shuffled = features[order]
labels_shuffled = labels[order]
print(features_shuffled)
print(labels_shuffled)
Verificare forme, modifiche e riproducibilità
Gli array devono avere dimensioni iniziali compatibili: le lunghezze lungo l’asse 0 devono coincidere, anche se le altre dimensioni possono differire. Per esempio, una matrice di righe di caratteristiche può essere abbinata a un array monodimensionale di etichette. Verifica le dimensioni iniziali prima di applicare un ordine di indici, così ogni indice sarà valido per tutti gli array.
I tre approcci differiscono per ciò che modificano. sklearn.utils.shuffle() restituisce array mescolati da assegnare. numpy.random.permutation() restituisce un nuovo ordine di indici; usarlo per indicizzare gli array crea risultati riordinati. numpy.random.shuffle() modifica l’array di indici ricevuto; in questi esempi non mescola direttamente gli array sorgente. In tutti i casi, la corrispondenza si mantiene solo se tutti gli array correlati usano lo stesso ordine.
Per riprodurre una disposizione, conserva l’array di indici generato e applicalo di nuovo agli array originali, oppure salvalo insieme ai dati. Riutilizzare lo stesso ordine ricrea la stessa disposizione senza dipendere da un’API per lo stato casuale non specificata. Se ti serve un nuovo mescolamento indipendente, genera un nuovo ordine. Questi esempi non garantiscono uno specifico ordine stampato.