2013-03-18 15 views
44

Jaka jest różnica między numpy.random.shuffle(x) i numpy.random.permutation(x)?shuffle vs permute numpy

Przeczytałem strony dokumentu, ale nie mogłem zrozumieć, czy istnieje jakaś różnica między tymi dwoma, gdy chcę tylko losowo przetasować elementy tablicy.

Aby być bardziej precyzyjnym, przypuśćmy, że mam tablicę x=[1,4,2,8].

Jeśli chcę generować losowe permutacje x, jaka jest różnica między shuffle(x) a permutation(x)?

Odpowiedz

55

np.random.permutation dwie różnice w np.random.shuffle:

  • jeśli przeszły tablicy, to otrzymamy przetasowane kopii tablicy; np.random.shuffle tasuje inplace tablicy
  • jeśli przeszły liczbą całkowitą, to będzie zwracać zdobyciem Zakres IE np.random.shuffle(np.arange(n))

If x is an integer, randomly permute np.arange(x). If x is an array, make a copy and shuffle the elements randomly.

Kod źródłowy może pomóc zrozumieć to:

3280  def permutation(self, object x): 
... 
3307   if isinstance(x, (int, np.integer)): 
3308    arr = np.arange(x) 
3309   else: 
3310    arr = np.array(x) 
3311   self.shuffle(arr) 
3312   return arr 
+0

Użyty w 'panda.Index', tylko' permutacja' działa, a 'shuffle' nie. Jak ta sprawa pasuje do twojego wyjaśnienia? – Heisenberg

+0

@ "permutacja" Heisenberga wymusza jego argumentację na ndarray (przez kopiowanie); 'pandas.Index' jest wystarczająco odmienny od ndarray, że' shuffle' nie będzie działał na nim, ale będzie działał na stworzonym z niego ndarray. – ecatmur

14

Dodając do tego, co @ecatmur powiedział: np.random.permutation jest przydatny, gdy trzeba przetasować zamówione pary, szczególnie dla klasyfikacji:

from np.random import permutation 
from sklearn.datasets import load_iris 
iris = load_iris() 
X = iris.data 
y = iris.target 

# Data is currently unshuffled; we should shuffle 
# each X[i] with its corresponding y[i] 
perm = permutation(len(X)) 
X = X[perm] 
y = y[perm] 
+0

Wciąż otrzymuję to: TypeError: tylko liczba skalarnych liczb całkowitych może zostać przekonwertowana na indeks skalarny –