Метод permutation
Метод permutation класса Generator
создает случайную перестановку элементов переданного массива или
возвращает перемешанный диапазон чисел от нуля до заданного значения.
Метод принимает один обязательный параметр - объект, который нужно
перемешать (массив, список, кортеж или целое число). Важно,
что метод возвращает новый перемешанный массив и не изменяет
исходный объект.
Синтаксис
rng.permutation(x)
Параметр x может быть целым числом (тогда возвращается
перемешанный диапазон от 0 до x-1), одномерным массивом,
списком или кортежем. Метод возвращает новый массив NumPy
с перемешанными элементами.
Пример с целым числом
Давайте создадим генератор с фиксированным зерном и получим перестановку чисел от 0 до 9:
import numpy as np
rng = np.random.default_rng(42)
arr = rng.permutation(10)
print(arr)
Результат выполнения кода:
[8 1 5 0 7 2 9 4 3 6]
Обратите внимание, что каждый вызов метода с одинаковым зерном дает одинаковый результат, что полезно для воспроизводимости экспериментов.
Пример с массивом
Давайте создадим массив чисел и получим его случайную перестановку:
import numpy as np
rng = np.random.default_rng(42)
original = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
arr = rng.permutation(original)
print("Исходный массив:", original)
print("Перемешанный:", arr)
Результат выполнения кода:
"Исходный массив: [ 1 2 3 4 5 6 7 8 9 10]"
"Перемешанный: [ 8 2 6 1 7 3 10 5 4 9]"
Метод создает новый массив, не изменяя исходный.
Пример со списком
Метод может принимать не только массивы NumPy, но и обычные списки Python:
import numpy as np
rng = np.random.default_rng(123)
my_list = ['a', 'b', 'c', 'd', 'e']
arr = rng.permutation(my_list)
print(arr)
Результат выполнения кода:
['e' 'c' 'a' 'd' 'b']
В результате возвращается массив NumPy со строками в случайном порядке.
Пример с многомерным массивом
При передаче многомерного массива метод переставляет только первую ось (строки), оставляя внутреннюю структуру неизменной:
import numpy as np
rng = np.random.default_rng(5)
original = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr = rng.permutation(original)
print("Исходный массив:")
print(original)
print("Перемешанный:")
print(arr)
Результат выполнения кода:
"Исходный массив:"
[[1 2 3]
[4 5 6]
[7 8 9]]
"Перемешанный:"
[[7 8 9]
[4 5 6]
[1 2 3]]
Как видите, строки массива были перемешаны, но элементы внутри каждой строки сохранили свой порядок.
Отличие от метода shuffle
В отличие от метода shuffle, который изменяет массив
на месте и ничего не возвращает, метод permutation
всегда создает новый массив:
import numpy as np
rng = np.random.default_rng(1)
arr = np.array([1, 2, 3, 4, 5])
# permutation создает новый массив
permuted = rng.permutation(arr)
print("После permutation:", permuted)
print("Исходный массив:", arr)
# shuffle изменяет массив на месте
rng.shuffle(arr)
print("После shuffle:", arr)
Результат выполнения кода:
"После permutation: [3 5 1 2 4]"
"Исходный массив: [1 2 3 4 5]"
"После shuffle: [3 5 1 2 4]"
Если вам нужно сохранить исходный массив, используйте метод
permutation. Если же изменение оригинала допустимо,
то метод shuffle будет более эффективным по памяти.