2013-03-18 16 views
44

Was ist der Unterschied zwischen numpy.random.shuffle(x) und numpy.random.permutation(x)?shuffle vs permute numpy

Ich habe die Doc-Seiten gelesen, aber ich konnte nicht verstehen, ob es einen Unterschied zwischen den beiden gab, wenn ich nur die Elemente eines Arrays zufällig mischen wollte.

Um genauer zu sein angenommen, ich habe ein Array x=[1,4,2,8]. Wenn ich zufällige Permutationen von x erzeugen möchte, was ist der Unterschied zwischen shuffle(x) und permutation(x)?

Antwort

55

np.random.permutation hat zwei Unterschiede von np.random.shuffle:

  • wenn ein Array übergeben, wird es eine schlurfte Kopie des Arrays zurückgeben; np.random.shuffle schlurft das Array inplace
  • wenn eine ganze Zahl übergeben, wird es eine schlurfte Bereich dh 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.

Der Quellcode dieses zu verstehen, könnte helfen, zurück:

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

Wenn auf einem 'panda.Index' verwendet, funktioniert nur' permutation' und 'shuffle' nicht. Wie passt dieser Fall in Ihre Erklärung? – Heisenberg

+0

@Heisenberg 'Permutation' zwingt sein Argument in ein ndarray (durch Kopieren); 'pandas.Index' ist ausreichend verschieden von einem ndarray, dass' shuffle' nicht funktioniert, sondern auf einem von ihm erzeugten ndarray funktioniert. – ecatmur

14

Hinzufügen auf, was @ ecatmur sagte, np.random.permutation ist nützlich, wenn Sie geordnete Paare, besonders für Klassifikation sortieren müssen:

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

Ich bekomme das immer: TypeError: Nur ganzzahlige skalare Arrays können in einen skalaren Index konvertiert werden –