logo

Перемешивание элементов массива в Python: простой способ

Быстрый ответ

Если вы хотите перемешать массив в Python, рекомендуется использовать функцию random.shuffle(). Она характеризуется высокой эффективностью и не требует дополнительной памяти, поскольку не создаёт копию массива:

Python
Скопировать код
import random

array = [1, 2, 3, 4, 5]
random.shuffle(array)
print(array)  # Возможный вывод: [3, 5, 1, 4, 2]

Перемешивание неизменяемых данных (сохраняя их неизменность)

Если необходимо сохранить оригинальный массив без изменений, следует использовать random.sample(). Функция возвращает перемешанную копию, оставляя исходный массив без изменений:

Python
Скопировать код
import random

array = [1, 2, 3, 4, 5]
shuffled_array = random.sample(array, len(array))
print(shuffled_array)  # Возможный вывод: [2, 4, 5, 3, 1]

Sklearn shuffle: Надёжный инструмент

Для перемешивания нескольких связанных массивов, что часто требуется при решении задач машинного обучения, можно использовать sklearn.utils.shuffle:

Python
Скопировать код
from sklearn.utils import shuffle

X = [1, 2, 3, 4, 5]
y = ['a', 'b', 'c', 'd', 'e']

X, y = shuffle(X, y, random_state=42)
print(X, y)  # Возможный вывод: [4, 3, 1, 5, 2] ['d', 'c', 'a', 'e', 'b']

Функция random_state обеспечивает возможность повторения результатов.

Условное перемешивание

Если требуется выполнить перемешивание по специальной логике, можно разработать свою функцию:

Python
Скопировать код
import random

def custom_shuffle(array):
    # Индивидуальная логика перемешивания
    random.seed(42)
    return shuffled_array

array = [1, 2, 3, 4, 5]
print(custom_shuffle(array))  # Теперь вы контролируете процесс!

Визуализация

Чтобы наглядно продемонстрировать работу перемешивания, представим массив в виде колоды карт:

Markdown
Скопировать код
До перемешивания: [♠️Т, ♦️3, ♥️К, ♣️2, 🃏В]

После применения random.shuffle():

Markdown
Скопировать код
После перемешивания: [♣️2, 🃏В, ♠️Т, ♥️К, ♦️3]

Таким образом, random.shuffle() случайным образом перемешивает элементы массива.

Альтернативы и особые случаи

В зависимости от характера данных и поставленной задачи, могут пригодиться другие методы перемешивания:

Перемешивание ND-массивов с использованием NumPy

Для перемешивания многомерных массивов большого размера будет уместно использовать np.random.shuffle:

Python
Скопировать код
import numpy as np

arr = np.array([1, 2, 3, 4, 5])
np.random.shuffle(arr)
print(arr)

Перемешивание внутри DataFrame Pandas

Для перемешивания табличных данных в pandas можно применить метод DataFrame.sample:

Python
Скопировать код
import pandas as pd

df = pd.DataFrame({'col1': [1, 2, 3, 4, 5], 'col2': ['a', 'b', 'c', 'd', 'e']})
shuffled_df = df.sample(frac=1).reset_index(drop=True)
print(shuffled_df)

Безопасное перемешивание с использованием модуля secrets

В случаях, когда немаловажны вопросы безопасности, следует использовать модуль secrets:

Python
Скопировать код
import secrets

def secure_shuffle(array):
    a = array[:]
    for i in range(len(a)):
        swap_idx = secrets.randbelow(i + 1)
        a[i], a[swap_idx] = a[swap_idx], a[i]
    return a

array = [1, 2, 3, 4, 5]
print(secure_shuffle(array))

Полезные материалы

  1. random — Генерация псевдослучайных чисел — документация Python — официальная документация по функции random.shuffle().
  2. numpy.random.shuffle — Руководство NumPy — использование функции перемешивания для многомерных массивов NumPy.
  3. Как случайным образом перемешать массив JavaScript? – Stack Overflow — способы перемешивания элементов массива на JavaScript.
  4. pandas.DataFrame.sample — документация pandas — использование функции перемешивания данных в DataFrame библиотеки pandas.
  5. Перемешивание Фишера–Йетса – Википедия — описание алгоритма перемешивания Фишера-Йетса.
  6. Учебник Python по генерации случайных чисел и данных с использованием модуля random – YouTube — учебное пособие по работе с модулем random в Python.
  7. secrets — Генерация безопасных случайных чисел — документация Python — описание модуля Python для безопасной генерации случайных чисел.