Voglio modificare una densa matrice di transizione quadrata sul posto cambiando l'ordine di molte delle sue righe e colonne, usando la libreria numpy di Python. Matematicamente questo corrisponde a pre-moltiplicare la matrice per la matrice di permutazione P e post-moltiplicarla per P ^ -1 = P ^ T, ma questa non è una soluzione computazionalmente ragionevole.
In questo momento sto scambiando manualmente righe e colonne, ma mi sarei aspettato che numpy avesse una bella funzione f (M, v) dove M ha n righe e colonne e v ha n voci, quindi f (M, v) si aggiorna M secondo la permutazione dell'indice v. Forse non riesco a cercare su Internet.
Qualcosa del genere potrebbe essere possibile con l '"indicizzazione avanzata" di numpy, ma la mia comprensione è che tale soluzione non sarebbe in atto. Anche per alcune semplici situazioni può essere sufficiente tenere traccia separatamente di una permutazione dell'indice, ma questo non è conveniente nel mio caso.
Aggiunto: a
volte quando le persone parlano di permutazioni, significano solo il campionamento di permutazioni casuali, ad esempio come parte di una procedura per ottenere valori p nelle statistiche. Oppure significano contare o enumerare tutte le possibili permutazioni. Non sto parlando di queste cose.
Aggiunto:
la matrice è abbastanza piccola da adattarsi alla RAM del desktop ma abbastanza grande da non volerlo copiare senza pensarci. In realtà vorrei usare matrici il più grandi possibile, ma non voglio affrontare l'inconveniente di non essere in grado di tenerle nella RAM, e faccio O (N ^ 3) operazioni LAPACK sulla matrice che anche limitare le dimensioni pratiche della matrice. Attualmente copio matrici così grandi inutilmente, ma spero che questo possa essere facilmente evitato per permutazione.
M[v]
per permutare le righe.