Перемешать массив с python, рандомизировать порядок элементов массива с python - PullRequest
228 голосов
/ 23 января 2009

Какой самый простой способ перемешать массив с помощью python?

Ответы [ 10 ]

418 голосов
/ 23 января 2009
import random
random.shuffle(array)
105 голосов
/ 23 января 2009
import random
random.shuffle(array)
27 голосов
/ 24 июля 2017

Альтернативный способ сделать это, используя sklearn

from sklearn.utils import shuffle
X=[1,2,3]
y = ['one', 'two', 'three']
X, y = shuffle(X, y, random_state=0)
print(X)
print(y)

Выход:

[2, 1, 3]
['two', 'one', 'three']

Преимущество: вы можете рандомизировать несколько массивов одновременно, не нарушая отображение. И «random_state» может контролировать перетасовку для воспроизводимого поведения.

21 голосов
/ 21 декабря 2011

Остальные ответы самые простые, однако немного раздражает, что метод random.shuffle фактически ничего не возвращает - он просто сортирует заданный список. Если вы хотите объединить вызовы или просто можете объявить перетасованный массив в одну строку, вы можете сделать:

    import random
    def my_shuffle(array):
        random.shuffle(array)
        return array

Тогда вы можете сделать строки вроде:

    for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
11 голосов
/ 28 октября 2013

При работе с обычными списками Python, random.shuffle() сделает работу так же, как показывают предыдущие ответы.

Но когда дело доходит до ndarray (numpy.array), random.shuffle, кажется, ломает оригинал ndarray. Вот пример:

import random
import numpy as np
import numpy.random

a = np.array([1,2,3,4,5,6])
a.shape = (3,2)
print a
random.shuffle(a) # a will definitely be destroyed
print a

Просто используйте: np.random.shuffle(a)

Как и random.shuffle, np.random.shuffle перемещает массив на месте.

9 голосов
/ 29 марта 2017

На всякий случай, если вам нужен новый массив, вы можете использовать sample:

import random
new_array = random.sample( array, len(array) )
2 голосов
/ 21 сентября 2018

Вы можете отсортировать ваш массив по случайному ключу

sorted(array, key = lambda x: random.random())

но похоже, что random.shuffle(array) будет быстрее, так как написано на C

1 голос
/ 18 ноября 2016

В дополнение к предыдущим ответам я хотел бы представить еще одну функцию.

numpy.random.shuffle и random.shuffle выполняют перетасовку на месте. Однако, если вы хотите вернуть перетасованный массив, numpy.random.permutation - это используемая функция.

0 голосов
/ 14 ноября 2018
# arr = numpy array to shuffle

def shuffle(arr):
    a = numpy.arange(len(arr))
    b = numpy.empty(1)
    for i in range(len(arr)):
        sel = numpy.random.random_integers(0, high=len(a)-1, size=1)
        b = numpy.append(b, a[sel])
        a = numpy.delete(a, sel)
    b = b[1:].astype(int)
    return arr[b]
0 голосов
/ 17 января 2017

Я не знаю, использовал ли я random.shuffle(), но он возвращает 'None' мне, поэтому я написал это, может быть полезным для кого-то

def shuffle(arr):
    for n in range(len(arr) - 1):
        rnd = random.randint(0, (len(arr) - 1))
        val1 = arr[rnd]
        val2 = arr[rnd - 1]

        arr[rnd - 1] = val1
        arr[rnd] = val2

    return arr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...