Home Hardware Networking Programmazione Software Domanda Sistemi
Conoscenza del computer >> Programmazione >> Python Programming >> .

Come posso utilizzare in modo efficiente la funzione permute NP in Python per generare tutte le possibili permutazioni di un determinato elenco?

Mentre `np.random.permutation` da numpy è eccellente per generare una * permutazione casuale *, non è lo strumento per generare * tutte * permutazioni. Per generare tutte le possibili permutazioni in modo efficiente, è necessario utilizzare la funzione `iTerTools.permutazioni dalla libreria standard. Numpy non è generalmente necessario per questo compito e `hertools` è altamente ottimizzato per la generazione di permutazione.

Ecco una ripartizione di come usare `iTertools.permutations" in modo efficiente, insieme al perché `np.random.permutation` non è adatto per generare tutte le permutazioni:

1. Utilizzando `iTertools.permutations` (l'approccio consigliato)

`` `Python

Importa iTtools

def all_permutations (input_list):

"" "

Genera tutte le possibili permutazioni di un elenco.

Args:

Input_list:l'elenco per cui generare permutazioni.

Ritorni:

Un generatore che produce tuple, in cui ogni tupla è una permutazione.

"" "

return iTertools.permutations (input_list)

Utilizzo di esempio:

my_list =[1, 2, 3]

permutazioni =all_permutations (my_list)

per perm in permutazioni:

Stampa (perm) # stampa ogni permutazione come tupla.

output:

(1, 2, 3)

(1, 3, 2)

(2, 1, 3)

(2, 3, 1)

(3, 1, 2)

(3, 2, 1)

Per convertire ogni permutazione in un elenco, usa:

my_list =[1, 2, 3]

permutazioni =all_permutations (my_list)

per perm in permutazioni:

Stampa (elenco (perm)) # stampa ogni permutazione come elenco

output:

[1, 2, 3]

[1, 3, 2]

[2, 1, 3]

[2, 3, 1]

[3, 1, 2]

[3, 2, 1]

per ottenere tutte le permutazioni come elenco di elenchi:

my_list =[1, 2, 3]

permutazioni =elenco (all_permutations (my_list)) # Converti il ​​generatore in un elenco

list_of_lists =[elenco (perm) per perm in permutazioni] # converti tuple in elenco

Stampa (list_of_lists)

output:

[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

`` `

Spiegazione:

* `iTertools.permutations (input_list)`: Questo è il nucleo della soluzione. Restituisce un * iteratore * (in particolare, un oggetto "Permutazioni"). Un iteratore è efficiente dalla memoria perché genera permutazioni su richiesta, una alla volta, invece di crearle tutte in una volta in memoria. Questo è cruciale per elenchi più lunghi in cui il numero di permutazioni può diventare estremamente grande (n! Cresce molto rapidamente).

* Generatore: L'uso di un generatore (l'iteratore) è importante per l'efficienza. Se si convertisce il generatore in un elenco in anticipo (ad es. Elenco (iTertools.permutations (input_list)) `), genererai immediatamente * tutte * permutazioni, che possono portare a problemi di memoria per elenchi di input più grandi. Elaborare le permutazioni una per una usando un loop `per '.

* `tuple` output: `iTertools.permutations` restituisce ogni permutazione come` tuple`. Se hai bisogno dell'output come `elenco`, è possibile convertire la tupla usando` elenco (perm) `.

* Efficienza: `iTertools.permutations` è implementato in C ed è altamente ottimizzato per questo compito. È il modo più efficiente per generare permutazioni in Python.

2. Perché `np.random.permutation` non è idoneo

`np.random.permutation` è progettato per generare * permutazioni casuali *, non tutte. Ecco perché non funzionerà correttamente allo scopo previsto:

* Casualità: Genera una singola permutazione casuale ogni volta che la chiami.

* Nessuna garanzia di tutte le permutazioni: Per ottenere * tutte * permutazioni con `np.random.permutation`, dovresti chiamarlo ripetutamente finché non hai visto tutto N! possibilità. Non c'è modo di sapere quando hai esaurito tutte le permutazioni senza tenere traccia di quelle che hai già visto, il che diventa estremamente complesso e inefficiente. Non vi è alcuna garanzia che tu genererai mai ogni possibile permutazione in questo modo.

* ripetizione inefficiente: Genereresti molte permutazioni duplicate prima (forse mai mai) vedendole tutte.

tentativo errato (e inefficiente) usando `np.random.permutation` (solo scopi illustrativi - non usare):

`` `Python

Importa Numpy come NP

def tentativo_all_permutations_with_numpy (input_list):

"" "

Non usarlo! È un tentativo errato e inefficiente

Per generare tutte le permutazioni usando np.random.permutation.

"" "

Visualizza_permutazioni =set ()

all_perms =[]

n =len (input_list)

factorication_n =np.math.factoriale (n) # Questo potrebbe traboccare!

mentre len (shew_permutations) perm =tuple (np.random.permutation (input_list)) # Converti in tuple per set

Se perman non in sew_permutations:

seve_permutations.add (perm)

all_perms.append (elenco (perm))

restituisce all_perms

Non usare questo esempio! È solo per dimostrazione del perché è errata.

my_list =[1, 2, 3]

permutazioni =tentativo_all_permutations_with_numpy (my_list) # potenzialmente impicca o usa memoria eccessiva.

stampa (permutazioni)

`` `

Problemi con il tentativo numpy:

* Problemi di memoria: Il set `Visuazioni_permutazioni" crescerebbe rapidamente a una dimensione enorme, potenzialmente superando la memoria disponibile, in particolare per elenchi leggermente più grandi.

* Efficienza: La condizione di loop `len (seve_permutations) * Erratezza: È possibile (sebbene statisticamente improbabile) che il ciclo termina prematuramente o non termini mai a causa della natura casuale della generazione di permutazione.

* Conversione Tuple: La conversione di array numpy in tuple e torna alle liste è un sovraccarico che "ITertools" evita.

In sintesi:

Per generare tutte le possibili permutazioni di un elenco in Python, usa sempre `iTertools.permutations` . È il modo corretto, più efficiente e pitonico per risolvere questo problema. Evitare l'utilizzo di `np.random.permutation` per questo scopo, in quanto è progettato per un compito diverso e porterà a un codice errato e inefficiente.

 

Programmazione © www.354353.com