shuffle vs permute numpy

77

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

Ich habe die Dokumentseiten gelesen, konnte aber nicht verstehen, ob es einen Unterschied zwischen den beiden gab, wenn ich nur die Elemente eines Arrays zufällig mischen möchte.

Genauer gesagt, ich habe ein Array x=[1,4,2,8].

Wenn ich zufällige Permutationen von x erzeugen möchte, was ist dann der Unterschied zwischen shuffle(x)und permutation(x)?

DotPi
quelle

Antworten:

106

np.random.permutationhat zwei Unterschiede zu np.random.shuffle:

  • Wenn ein Array übergeben wird, wird eine gemischte Kopie des Arrays zurückgegeben. np.random.shufflemischt das Array an Ort und Stelle
  • Wenn eine Ganzzahl übergeben wird, wird ein gemischter Bereich zurückgegeben, d. h np.random.shuffle(np.arange(n))

Wenn x eine ganze Zahl ist, permutieren Sie np.arange (x) zufällig. Wenn x ein Array ist, erstellen Sie eine Kopie und mischen Sie die Elemente nach dem Zufallsprinzip.

Der Quellcode kann helfen, dies zu verstehen:

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
ecatmur
quelle
2
Funktioniert bei a panda.Indexnur permutationund shufflefunktioniert nicht. Wie passt dieser Fall in Ihre Erklärung?
Heisenberg
1
@ Heisenberg permutationzwingt seine Argumentation in ein ndarray (durch Kopieren); pandas.Indexunterscheidet sich ausreichend von einem ndarray, shuffledas nicht daran arbeitet, aber an einem daraus erstellten ndarray.
Ecatmur
31

Das Hinzufügen zu dem, was @ecatmur gesagt hat, np.random.permutationist nützlich, wenn Sie geordnete Paare mischen müssen, insbesondere für die Klassifizierung:

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]
hlin117
quelle
1
Ich bekomme immer wieder folgendes: TypeError: Nur ganzzahlige skalare Arrays können in einen skalaren Index konvertiert werden
John Ktejik
2
Um @ hlin117 zu verdeutlichen, funktioniert dies nur, wenn x und y numpy Arrays sind. Wenn Sie versuchen, dies mit in Python integrierten Listen zu tun, wird der TypeError ausgelöst.
Benjaminjsanders
1

Hier ist eine kurze Erklärung, die @ecatmur hinzufügt. Zunächst habe ich ein Array erstellt, das die Form 3,3 hat und Zahlen von 0 bis 8 hat

import numpy as np
x1 = np.array(np.arange(0,9)).reshape(3,3) #array with shape 3,3 and have numbers from 0 to 8

#step1: using np.random.permutation
x_per = np.random.permutation(x1)
print('x_per:', x_per)
print('x_1:', x_1)
#Inference: x1 is not changed and x_per has its rows randomly changed

#The outcome will be 
x1: [[0 1 2]
     [3 4 5]
     [6 7 8]]
x_per:[[3 4 5]
       [0 1 2]
       [6 7 8]]
#Lets apply shuffling
x2 = np.array(range(9)).reshape(3,3)
x2_shuffle = np.random.shuffle(x2)
print('x2_shuffle:', x2_shuffle)
print('x2', x2)

#Outcome: 
x2_shuffle: None
x2 [[3 4 5]
    [0 1 2]
    [6 7 8]]

Die wichtigste Schlussfolgerung ist: Wenn x ein Array ist, können sowohl numpy.random.permutation (x) als auch numpy.random.shuffle (x) die Elemente in x zufällig entlang der ersten Achse permutieren. numpy.random.permutation (x) gibt tatsächlich eine neue Variable zurück und die ursprünglichen Daten werden nicht geändert. Wobei numpy.random.shuffle (x) die Originaldaten geändert hat und keine neue Variable zurückgibt. Ich habe nur versucht, mit einem Beispiel zu zeigen, damit es anderen helfen kann. Vielen Dank!!

Mohanrac
quelle
1

Die permutation () -Methode gibt ein neu angeordnetes Array zurück (und lässt das ursprüngliche Array unverändert). Diese Methode behält das ursprüngliche Array bei und gibt ein gemischtes Array zurück, z. B. x = [1,4,2,8]. ist das ursprüngliche Array und die Permutationsmethode gibt das neu angeordnete Array zurück (sagen wir [8,4,1,2]). Jetzt haben Sie zwei Arrays, das ursprüngliche Array und das neu angeordnete Array.

In der anderen Hand,

Die shuffle () -Methode nimmt Änderungen am ursprünglichen Array vor, z. B. x = [1,4,2,8] ist das ursprüngliche Array, und die shuffle-Methode gibt das gemischte Array zurück (sagen wir, das gemischte Array ist [8,4,1] , 2]). Jetzt wurde das ursprüngliche Array selbst in das gemischte Array geändert, und Sie haben nur noch das gemischte Array.

Referenz: - https://www.w3schools.com/python/numpy_random_permutation.asp

Partha Sarathi Satapathy
quelle