Какой самый простой способ перетасовать массив с помощью Python?
Перемешать массив с помощью python, рандомизировать порядок элементов массива с помощью python
Ответы (10)
Альтернативный способ сделать это с помощью 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']):
На всякий случай, если вам нужен новый массив, вы можете использовать sample
:
import random
new_array = random.sample( array, len(array) )
При работе с обычными списками Python random.shuffle()
выполнит работу, как показано в предыдущих ответах.
Но когда дело доходит до _2 _ (_ 3_), 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
перемещает массив на место.
Вы можете отсортировать свой массив со случайным ключом
sorted(array, key = lambda x: random.random())
ключ можно прочитать только один раз, поэтому сравнение элементов во время сортировки по-прежнему эффективно.
но похоже, что random.shuffle(array)
будет быстрее, так как он написан на C
это O (log (N)) кстати
array
. Я имел в виду элемент Random
: т.е. в lambda
random.random()
мог каждый раз генерировать новый экземпляр класса Random
. Я не совсем уверен: в java
это было бы неправильным способом: вы должны создать Random rng = Random()
, а затем вызвать rng.nextGaussian()
. Но не знаю, как работает python random.random()
- person WestCoastProjects; 17.10.2018
В дополнение к предыдущим ответам я хотел бы представить еще одну функцию.
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
Имейте в виду, что 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()
.
shuffled = sample(array, k=len(array))
- person allenh; 10.06.2021
new_array = list(array); random.shuffle(new_array)
- person James Parker; 21.08.2020
new_array = list(array); random.shuffle(new_array)
, поскольку они не являются командами в отдельных строках. Джеймс сначала создает копию, а затем перетасовывает массив.
- person Charlie Parker; 23.08.2020
new_array = random.sample( array, len(array) )
. - person Charlie Parker   schedule 29.03.2017