2013-12-12 14 views
12

Nehmen wir an, ich habe ein Array r der Dimension (n, m). Ich möchte die Spalten dieses Arrays mischen.Shuffle-Spalten eines Arrays mit Numpy

Wenn ich numpy.random.shuffle(r) verwende, mischt es die Zeilen. Wie kann ich nur die Spalten mischen? So dass die erste Spalte die zweite wird und die dritte die erste, usw., zufällig.

Beispiel:

Eingang:

array([[ 1, 20, 100], 
     [ 2, 31, 401], 
     [ 8, 11, 108]]) 

Ausgang:

array([[ 20, 1, 100], 
     [ 31, 2, 401], 
     [ 11, 8, 108]]) 

Antwort

13

Während fragen Ich dachte, vielleicht könnte ich die transponierten Matrix mischen:

np.random.shuffle(np.transpose(r)) 

Es sieht so aus, als ob es den Job erledigt. Ich würde Kommentare schätzen, um zu wissen, ob es ein guter Weg ist, dies zu erreichen.

+1

Es ist. Ich empfehle jedoch 'r.T' für die Transponierung. – user2357112

+1

@ user2357112 ist 'r.T' genau dasselbe wie' np.transpose (r) 'aber kürzer? –

+1

Effektiv identisch. Es gibt einen sehr kleinen Unterschied für 1-d-Arrays, aber Sie werden wahrscheinlich weder 'T' noch 'transpose' für 1-d-Arrays verwenden. – user2357112

6

Für eine allgemeine Achse Sie das Muster folgen konnte:

>>> import numpy as np 
>>> 
>>> a = np.array([[ 1, 20, 100, 4], 
...    [ 2, 31, 401, 5], 
...    [ 8, 11, 108, 6]]) 
>>> 
>>> print a[:, np.random.permutation(a.shape[1])] 
[[ 4 1 20 100] 
[ 5 2 31 401] 
[ 6 8 11 108]] 
>>> 
>>> print a[np.random.permutation(a.shape[0]), :] 
[[ 1 20 100 4] 
[ 2 31 401 5] 
[ 8 11 108 6]] 
>>> 
+0

Ihr zweites Beispiel scheint nicht gemischt zu sein ... – onewhaleid

2

einen Schritt weiter von Ihrer Antwort also:

Edit: Ich könnte sehr leicht verwechselt werden, wie dies funktioniert, so dass ich m bei jedem Schritt mein Verständnis des Zustands der Matrix einzufügen.

r == 1 2 3 
    4 5 6 
    6 7 8 

r = np.transpose(r) 

r == 1 4 6 
    2 5 7 
    3 6 8   # Columns are now rows 

np.random.shuffle(r) 

r == 2 5 7 
    3 6 8 
    1 4 6   # Columns-as-rows are shuffled 

r = np.transpose(r) 

r == 2 3 1 
    5 6 4 
    7 8 6   # Columns are columns again, shuffled. 

die dann wieder in der richtigen Form sein würde, mit den Spalten neu angeordnet.

Die Transponierte der Transponierten einer Matrix == dieser Matrix, oder, [A^T]^T == A. Sie müssten also nach dem Shuffle eine zweite Transponierung durchführen (weil eine Transponierung nicht möglich ist) ein Shuffle), damit es wieder in seiner richtigen Form ist.

Edit: Die Antwort des OPs überspringt das Speichern der Transpositionen und lässt stattdessen den Shuffle auf r laufen, als ob es wäre.

+0

'np.random.shuffle' gibt das Array nicht zurück. –

+0

Also ich sehe, bearbeitet. Unabhängig davon ist der letzte Schritt erforderlich, um Ihre Matrix in ihre ursprüngliche Form zurückzuführen. – Matt

+0

@Matt: Nein, nein ist es nicht. transpose gibt eine Ansicht des ursprünglichen Arrays zurück. Sobald Sie das transponierte Array mischen, wird das Original in der gewünschten Weise gemischt. Es gibt keine Notwendigkeit, zweimal zu transponieren. – user2357112

0

Im Allgemeinen, wenn Sie wollen i eine numpy Array entlang der Achse mischen:

def shuffle(x, axis = 0): 
    n_axis = len(x.shape) 
    t = np.arange(n_axis) 
    t[0] = axis 
    t[axis] = 0 
    xt = np.transpose(x.copy(), t) 
    np.random.shuffle(xt) 
    shuffled_x = np.transpose(xt, t) 
    return shuffled_x 

shuffle(array, axis=i)