Який найпростіший спосіб перетасувати масив з 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
елемент: тобто в може бути генеруючим новим екземпляр класу кожен раз. Я насправді не впевнений: у цьому було б неправильним способом це зробити: ви повинні створити і потім викликати . Але не впевнений, як працює пітонlambda
random.random()
Random
java
Random rng = Random()
rng.nextGaussian()
random.random()
Я не знаю, що я використав, 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
Майте на увазі, що 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()
.