HOWTO · NumPy

Funzione numpy.random.permutation() in NumPy

La funzione numpy.random.permutation() restituisce una copia permutata in modo casuale di un array, o un intervallo permutato di interi quando le viene passato un intero, e lascia i dati originali invariati — a differenza di numpy.random.shuffle(), che mescola l'array sul posto.

In questa pagina

numpy.random.permutation() permuta in modo casuale una sequenza, oppure restituisce un intervallo permutato. Passagli un array e restituisce una copia mescolata di quell’array — l’originale resta esattamente com’era. Passagli un intero n e restituisce gli interi da 0 a n - 1 in ordine casuale. Questo comportamento di copiare invece di modificare è tutta la differenza rispetto a numpy.random.shuffle(), che mescola un array sul posto.

Permutare un array senza modificare l’originale

Con un array, permutation() costruisce un nuovo array che contiene gli stessi elementi in ordine casuale:

import numpy as np

original_array = np.array([1, 2, 3, 4, 5])
shuffled_array = np.random.permutation(original_array)

print("Original Array:", original_array)
print("Shuffled Array:", shuffled_array)

Output:

Original Array: [1 2 3 4 5]
Shuffled Array: [3 1 5 2 4]

L’ordine in shuffled_array è casuale, quindi l’output sopra è un risultato possibile, non ciò che ogni esecuzione produce. Ciò che non varia è original_array: contiene ancora [1 2 3 4 5], il che rende permutation() la scelta giusta quando l’ordine originale conta ancora in seguito — ad esempio, quando un set di dati deve rimanere allineato con le sue etichette.

Con un intero, permutation() restituisce un intervallo permutato, che è un modo comodo per ottenere indici casuali:

import numpy as np

n = 5
permuted_indices = np.random.permutation(n)

print("Permuted Indices:", permuted_indices)

Output:

Permuted Indices: [4 0 2 3 1]

Anche qui, l’ordine esatto differisce da un’esecuzione all’altra. Passare un intero equivale a costruire prima l’intervallo con np.arange(n) e permutare quell’array.

Confrontare permutation() e shuffle()

Le due funzioni differiscono per ciò che restituiscono e per ciò che fanno ai tuoi dati. permutation() restituisce un nuovo array e non tocca mai il suo input. numpy.random.shuffle() non restituisce nulla e riordina l’array stesso, sul posto:

import numpy as np

original_array = np.array([1, 2, 3, 4, 5])
np.random.shuffle(original_array)

print("Shuffled Original Array:", original_array)

Output:

Shuffled Original Array: [2 5 1 4 3]

Dopo questa chiamata, l’ordine originale è perso. Scegli shuffle() quando non ti serve e vuoi riordinare sul posto; scegli permutation() quando l’originale deve sopravvivere. Una conseguenza pratica della copia: su un set di dati grande, permutation() ha bisogno di memoria per il secondo array, quindi valuta questa comodità rispetto alla memoria aggiuntiva quando i dati sono grandi.