Перетасуйте массив с помощью Python, рандомизируйте порядок элементов массива с помощью Python
Вопрос
Какой самый простой способ перетасовать массив с помощью Python?
Решение
import random
random.shuffle(array)
Другие советы
import random
random.shuffle(array)
Альтернативный способ сделать это, используя запоминать
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» может управлять перетасовкой для обеспечения воспроизводимого поведения.
Остальные ответы самые простые, однако немного раздражает, что метод random.shuffle
на самом деле ничего не возвращает - он просто сортирует указанный список. Если вы хотите объединить вызовы или просто можете объявить перетасованный массив в одну строку, вы можете сделать следующее:
import random
def my_shuffle(array):
random.shuffle(array)
return array
Тогда вы можете сделать строки вроде:
for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
При работе с обычными списками Python random.shuffle()
выполнит работу так же, как показано в предыдущих ответах.
Но когда дело доходит до ndarray
(numpy.array
), random.shuffle
, похоже, ломает оригинал np.random.shuffle(a)
. Вот пример:
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
Как и <=>, <=> перетасовывает массив на месте.
На всякий случай, если вам нужен новый массив, вы можете использовать sample
:
import random
new_array = random.sample( array, len(array) )
Вы можете отсортировать ваш массив по случайному ключу
sorted(array, key = lambda x: random.random())
но похоже, что random.shuffle(array)
будет быстрее, так как написано на C
В дополнение к предыдущим ответам я хотел бы представить еще одну функцию.
numpy.random.shuffle
а также random.shuffle
выполняйте перемешивание на месте. Однако, если вы хотите вернуть перемешанный массив, numpy.random.permutation
- это используемая функция.
Я не знаю, использовал ли я 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
# 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]