Какой самый простой способ перемешать массив с помощью Python?
new_array = random.sample( array, len(array) )
.
Какой самый простой способ перемешать массив с помощью Python?
new_array = random.sample( array, len(array) )
.
Ответы:
import random
random.shuffle(array)
import random
random.shuffle(array)
Альтернативный способ сделать это с помощью 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» может контролировать перетасовку для воспроизводимого поведения.
Остальные ответы самые простые, однако немного раздражает, что 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
кажется, сломать оригинал 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) )
Вы можете отсортировать ваш массив со случайным ключом
sorted(array, key = lambda x: random.random())
ключ читается только один раз, поэтому сравнение элементов во время сортировки остается эффективным.
но похоже random.shuffle(array)
будет быстрее так как написано на С
array
я имел в виду Random
элемент: то есть в может быть генерирующим новым экземпляр класса каждый раз. На самом деле я не уверен: это был бы неправильный способ сделать это: вы должны создать и затем вызвать . Но не уверен, как работает Pythonlambda
random.random()
Random
java
Random rng = Random()
rng.nextGaussian()
random.random()
Я не знаю, использовал ли 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
Помните, что random.shuffle()
не следует использовать многомерные массивы, поскольку это вызывает повторения.
Представьте, что вы хотите перетащить массив вдоль его первого измерения, мы можем создать следующий тестовый пример:
import numpy as np
x = np.zeros((10, 2, 3))
for i in range(10):
x[i, ...] = i*np.ones((2,3))
так что вдоль первой оси i-й элемент соответствует матрице 2x3, где все элементы равны i.
Если мы используем правильную функцию тасования для многомерных массивов, т. np.random.shuffle(x)
Е. Массив будет перетасовываться вдоль первой оси по желанию. Однако использование random.shuffle(x)
приведет к повторениям. Вы можете проверить это, запустив len(np.unique(x))
после перетасовки, что дает 10 (как и ожидалось), np.random.shuffle()
но только около 5 при использовании random.shuffle()
.