2016-11-28 8 views
2

Eine Ganzzahl geben k Wie würde ich eine Permutationsmatrix mit allen möglichen Permutationen der Sequenz 1 bis k erstellen? Betrachten wir zum Beispiel k=2. Dann würde Ich mag die Matrix erstellen:Permutationsmatrix erstellen - numpy

1 2 
2 1 

und für k=3:

1 1 2 2 3 3 
2 3 1 3 1 2 
3 2 3 1 2 1 

Ich habe versucht, mit numpy.random.permutation aber das erzeugt nur eine einzige Permutation. Also, ich könnte diese Funktion weiter verwenden und einzigartige Permutationen anhängen, bis die Anzahl der Spalten gleich k! ist, aber das scheint unglaublich ineffizient zu sein.

+1

was 'itertools.permutations' in eine numpy Array füttern? –

+0

@YakymPirozhenko ist es möglich, dies zu tun, ohne 'itertools' zu importieren? – Apollo

+3

Nun, es sei denn, Sie möchten Ihre eigene Funktion schreiben, um eine Liste von Permutationen zu erstellen. Da 'iertools' ein eingebautes Modul ist, kann ich nicht viel Nachteil beim Importieren sehen, es sei denn, Sie haben einige explizite Einschränkungen. –

Antwort

0

Basierend off this answer:

import numpy as np 
import itertools as it 
import math 
def myPerms(k): 
    f_k=math.factorial(k) 
    A=np.empty((k,f_k)) 
    for i,perm in enumerate(it.permutations(range(k))): 
    A[:,i] = perm 
    A+=1 
    return A 

print(myPerms(3)) 
#[[ 1. 1. 2. 2. 3. 3.] 
# [ 2. 3. 1. 3. 1. 2.] 
# [ 3. 2. 3. 1. 2. 1.]] 
0

Wie wäre es eine reine numpy Lösung:

from math import factorial as fac 
import numpy as np 

def permmat(n): 
    if n==1: 
     return np.array([[1]], dtype=np.int8) 
    fnm1 = fac(n-1) 
    pmat_nm1 = permmat(n-1) 
    pmat = np.empty((n, fac(n)), dtype=np.int8) 
    pmat[0] = np.repeat(np.arange(n,0,-1), fnm1) 
    pmat[1:, :fnm1] = pmat_nm1 
    for i in range(1,n): 
     view = pmat[1:, fnm1*i:fnm1*(i+1)] 
     view[:,:] = pmat_nm1 
     view[pmat_nm1==(n-i)] = n 
    return pmat 

print(permmat(4)) 

Ausgang:

[[4 4 4 4 4 4 3 3 3 3 3 3 2 2 2 2 2 2 1 1 1 1 1 1] 
[3 3 2 2 1 1 4 4 2 2 1 1 3 3 4 4 1 1 3 3 2 2 4 4] 
[2 1 3 1 2 3 2 1 4 1 2 4 4 1 3 1 4 3 2 4 3 4 2 3] 
[1 2 1 3 3 2 1 2 1 4 4 2 1 4 1 3 3 4 4 2 4 3 3 2]] 

Es gibt immer noch Raum für einige Performance-Hack, aber ich bin zu faul, sie zu schreiben.

0

meine Lösung:

perm_mat = np.zeros(PERM_SIZE,NUM_OF_PERM)) 
for i in range(NUM_OF_PERM): 
perm_mat[:,i] = np.random.permutation(PERM_SIZE)) 
perm_mat = perm_mat.astype(int) 
Verwandte Themen