Перемешать массив с python, рандомизировать порядок элементов массива с python


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

9 195

9 ответов:

import random
random.shuffle(array)
import random
random.shuffle(array)

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

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

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

    for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):

альтернативный способ сделать это с помощью 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" может управлять перетасовкой для воспроизводимого поведения.

при работе с обычными списками 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 перемешивает массив на месте.

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

import random
new_array = random.sample( array, len(array) )

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

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

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

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
sorted(self.nums, key = lambda x: random.random())