Метод shuffle
Метод shuffle класса Generator изменяет порядок элементов массива случайным образом. Он работает непосредственно с исходным массивом (in-place), то есть не создает новый массив, а переставляет элементы в существующем. Первым параметром метод принимает массив или изменяемую последовательность. Для многомерных массивов по умолчанию перемешиваются только элементы первого измерения (строки), если не указано иное.
Синтаксис
generator.shuffle(arr, axis=None)
Параметры
Метод имеет два параметра:
- arr - массив или изменяемая последовательность, элементы которой нужно перемешать. Для многомерных массивов перемешивание происходит вдоль первой оси по умолчанию.
- axis - необязательный параметр, определяющий ось, вдоль которой выполняется перемешивание. Если ось не указана, перемешиваются элементы вдоль первой оси. Для одномерных массивов параметр игнорируется.
Пример
Давайте создадим генератор случайных чисел с фиксированным зерном и перемешаем одномерный массив:
import numpy as np
rng = np.random.default_rng(0)
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
rng.shuffle(arr)
print(arr)
Результат выполнения кода:
[6 9 7 2 3 8 1 5 4 0]
Обратите внимание, что исходный массив был изменен - элементы перемешались случайным образом.
Пример
Теперь перемешаем двумерный массив. По умолчанию перемешиваются только строки (первая ось):
import numpy as np
rng = np.random.default_rng(1)
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
rng.shuffle(arr)
print(arr)
Результат выполнения кода:
[[7 8 9]
[1 2 3]
[4 5 6]]
Как видно, строки массива поменялись местами, а содержимое каждой строки осталось без изменений.
Пример
С помощью параметра axis можно указать, по какой оси перемешивать элементы. Например, перемешаем столбцы двумерного массива (ось 1):
import numpy as np
rng = np.random.default_rng(2)
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
rng.shuffle(arr, axis=1)
print(arr)
Результат выполнения кода:
[[3 1 2]
[6 4 5]
[9 7 8]]
Теперь элементы в каждой строке перемешались независимо - столбцы переставлены внутри каждой строки.
Пример
Метод shuffle работает только с изменяемыми объектами. Попытка передать неизменяемую последовательность вызовет ошибку:
import numpy as np
rng = np.random.default_rng(3)
arr_tuple = (1, 2, 3, 4, 5)
try:
rng.shuffle(arr_tuple)
except TypeError as e:
print(e)
Результат выполнения кода:
"shuffle() only supports mutable sequence types"
Для кортежей и других неизменяемых последовательностей используйте метод permutation, который возвращает новый перемешанный массив.
Пример
Метод shuffle также можно использовать с обычными списками Python:
import numpy as np
rng = np.random.default_rng(4)
my_list = [10, 20, 30, 40, 50]
rng.shuffle(my_list)
print(my_list)
Результат выполнения кода:
[40, 10, 50, 30, 20]
Обратите внимание, что метод изменяет список на месте, как и в случае с массивами.
Смотрите также
-
метод
permutation,
который возвращает новый перемешанный массив, не изменяя исходный -
метод
permuted,
который перемешивает элементы вдоль указанной оси независимо для каждого среза -
метод
choice,
который генерирует случайную выборку из массива с возможностью повторений -
метод
random,
который генерирует случайные числа в полуоткрытом интервале [0.0, 1.0)