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