перетасувати проти перестановки numpy


81

У чому різниця між numpy.random.shuffle(x)і numpy.random.permutation(x)?

Я прочитав сторінки документації, але не міг зрозуміти, чи є якась різниця між ними, коли я просто хочу випадковим чином перемішати елементи масиву.

Якщо бути точнішим, припустимо, що я маю масив x=[1,4,2,8].

Якщо я хочу сформувати випадкові перестановки x, то в чому різниця між shuffle(x)і permutation(x)?

Відповіді:


110

np.random.permutationмає дві відмінності від np.random.shuffle:

  • якщо передано масив, він поверне перемішану копію масиву; np.random.shuffleперетасовує масив на місці
  • якщо передано ціле число, воно поверне перемішаний діапазон, тобто np.random.shuffle(np.arange(n))

Якщо x - ціле число, випадковим чином перестановіть np.arange (x). Якщо x - це масив, зробіть копію та довільно перемішайте елементи.

Вихідний код може допомогти зрозуміти це:

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

2
При використанні на panda.Index, permutationпрацює тільки, а shuffleні. Як цей випадок вписується у ваше пояснення?
Гайзенберг,

1
@Heisenberg permutationпримушує свій аргумент до ndarray (шляхом копіювання); pandas.Indexдостатньо відрізняється від ndarray, який shuffleне працюватиме на ньому, але працюватиме над ndarray, створеним з нього.
ecatmur

32

Додавання до сказаного @ecatmur np.random.permutationкорисно, коли вам потрібно перетасувати впорядковані пари, особливо для класифікації:

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]

1
Я постійно отримую це: TypeError: лише цілочисельні скалярні масиви можуть бути перетворені в скалярний індекс
Джон Ктеджік

2
Щоб пояснити @ hlin117, це працює, лише якщо x та y є масивами numpy. Якщо ви спробуєте зробити це за допомогою вбудованих списків пітонів, це викличе TypeError.
benjaminjsanders

1

Додаючи на @ecatmur, ось коротке пояснення. Для початку я створив масив, який має форму 3,3 і має числа від 0 до 8

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

Ключовий висновок: коли x є масивом, як numpy.random.permutation (x), так і numpy.random.shuffle (x) можуть переставляти елементи в x випадковим чином по першій осі. numpy.random.permutation (x) фактично повертає нову змінну, і вихідні дані не змінюються. Де як numpy.random.shuffle (x) змінив вихідні дані і не повертає нову змінну. Я просто намагався показати на прикладі, щоб це могло допомогти іншим. Дякую!!


1

Метод перестановки () повертає переупорядкований масив (і залишає вихідний масив незмінним), цей метод збереже непорушним вихідний масив і поверне перемішаний масив, наприклад x = [1,4,2,8] є вихідним масивом, а метод перестановки поверне переставлений масив (скажімо, [8,4,1,2]). Тепер у вас є два масиви, оригінальний масив і переставлений масив.

В іншій руці,

Метод shuffle () вносить зміни в вихідний масив, наприклад x = [1,4,2,8] - оригінальний масив, а метод shuffle поверне перемішаний масив (скажімо, перемішаний масив становить [8,4,1 , 2]). Тепер оригінальний масив змінено на перетасований масив, і у вас залишився лише перетасований масив.

Довідково: - https://www.w3schools.com/python/numpy_random_permutation.asp

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.