2013-12-12 26 views
12

Załóżmy, że mam tablicę r o wymiarach (n, m). Chciałbym przetasować kolumny tej tablicy.Pomieszaj kolumny tablicy z Numpy

Jeśli użyję numpy.random.shuffle(r), przetasuje linie. Jak mogę przetasować tylko kolumny? Tak, aby pierwsza kolumna stała się drugą, a trzecią pierwszą, itd., Losowo.

Przykład:

wejściowe:

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

wyjściowa:

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

Odpowiedz

13

Podczas pytaniem myślałem o mógłbym przetasować transpozycji tablicy:

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

Wygląda na to, że spełnia swoją funkcję. Byłbym wdzięczny za komentarze, aby wiedzieć, czy to dobry sposób na osiągnięcie tego.

+1

jest. Polecam jednak 'r.T' do transpozycji. – user2357112

+1

@ user2357112 to 'r.T' dokładnie to samo, co' np.transpose (r) 'ale krótszy? –

+1

Skutecznie identyczne. Istnieje niewielka różnica w tablicach 1-d, ale prawdopodobnie nie użyjesz 'T' ani' transpose' dla tablic 1-d. – user2357112

6

Dla ogólnego osi można śledzić wzoru:

>>> 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

Twój drugi przykład wydaje się być niezasilony ... – onewhaleid

2

Więc, jeden krok dalej od swojej odpowiedzi:

Edit: I bardzo łatwo można pomylić, jak to działa, więc jestem m wstawiając moje zrozumienie stanu macierzy na każdym kroku.

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. 

, który następnie powróciłby do właściwego kształtu, z kolumnami uporządkowanymi.

Transpozycja transpozycji macierzy == tej macierzy, lub, [A^T]^T == A. Po przetasowaniu trzeba wykonać drugą transpozycję (ponieważ transpozycja nie jest przetasowanie), aby ponownie uzyskać właściwą formę.

Edycja: Odpowiedź OP pomija zapisywanie transpozycji, a zamiast tego pozwala tasować operację na r, jak gdyby była.

+0

'np.random.shuffle' nie zwraca tablicy. –

+0

Widzę, edytowałem. Niezależnie od tego, ostatni krok jest potrzebny, aby przywrócić macierz do pierwotnego kształtu. – Matt

+0

@Matt: Nie, nie, nie jest. 'transpose' zwraca widok oryginalnej tablicy. Po przetasowaniu transponowanej tablicy, oryginał jest tasowany w pożądany sposób. Nie ma potrzeby transpozycji dwa razy. – user2357112

0

W ogóle, jeśli chcesz shuffle do tablicy numpy wzdłuż osi i:

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)