2013-03-18 25 views
44

Qual è la differenza tra numpy.random.shuffle(x) e numpy.random.permutation(x)?shuffle vs permute numpy

Ho letto le pagine del documento ma non ho potuto capire se ci fosse qualche differenza tra i due quando voglio solo mescolare casualmente gli elementi di un array.

Per essere più precisi, supponiamo di disporre di un array x=[1,4,2,8].

Se voglio generare permutazioni casuali di x, qual è la differenza tra shuffle(x) e permutation(x)?

risposta

55

np.random.permutation presenta due differenze rispetto np.random.shuffle:

  • se passato un array, verrà restituito un mescolato copia dell'array; np.random.shuffle rimescola l'inplace matrice
  • caso di intero, verrà restituito un intervallo cioè mescolato 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.

Il codice sorgente potrebbe aiutare a capire questo:

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

Se usato su un 'panda.Index', solo' permutation' funziona e 'shuffle' no. Come si inserisce questo caso nella tua spiegazione? – Heisenberg

+0

@Heisenberg 'permutation' costruisce il suo argomento in un narray (copiando); 'pandas.Index' è sufficientemente diverso da un narray che' shuffle' non funzionerà su di esso, ma funzionerà su un ndarray creato da esso. – ecatmur

14

aggiunta a ciò @ecatmur ha detto, np.random.permutation è utile quando è necessario mischiare coppie ordinate, in particolare per la classificazione:

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

Continuo a ricevere questo: TypeError: solo gli array scalari interi possono essere convertiti in un indice scalare –