Случайные числа в NumPy. Вероятности и перетасовки
Создано: 04.12.2025
Для генерации случайных чисел, состоящих из них массивов, перетасовок и другого в NumPy есть свой модуль — random.
Функция randint этого модуля возвращает одно целое число или массив таковых. В простых вариантах ее использования можно задать только одну границу (нижняя будет от нуля), две, указать форму массива, тип данных.
import numpy as np a = np.random.randint(2) # 0 или 1. Верхняя граница не входит print(a, type(a)) b = np.random.randint(-5, 10) print(b) c = np.random.randint(50, size=3, dtype='i2') print(c, type(c), c.dtype) d = np.random.randint(50, size=(2, 2, 5)) print(d, d.dtype)
1 <class 'int'> -2 [34 29 23] <class 'numpy.ndarray'> int16 [[[ 7 42 45 14 13] [49 11 31 36 47]] [[48 30 21 48 20] [13 27 47 4 7]]] int64
В более сложных вариантах можно задать границы для каждого числа в массиве или для каждого вложенного массива.
import numpy as np a = np.random.randint(1, [10, 100, 1000, 50]) print(a) b = np.random.randint([-10, 0, 20], [0, 10, 100]) print(b) c = np.random.randint([0, 1, 2], [[10], [100]]) print(c)
[ 3 35 868 10] [-10 5 79] [[ 1 6 3] [86 83 50]]
Функция (метод) rand используется для генерации массивов вещественных чисел. Без аргументов выдает одно число в пределах [0, 1). Аргументы обозначают форму массива:
a = np.random.rand() print(round(a, 2)) b = np.random.rand(3) * 2 + 5 print(b.round(2)) c = np.random.rand(2, 5) print(c.round(2))
0.22 [5.67 5.92 6.75] [[0.58 0.07 0.67 0.88 0.66] [0.39 0.8 0.85 0.31 0.15]]
Для создания массивов только из заданных значений используется метод choice:
a = np.random.choice(['x', 'y', 'z'], size=5) print(a) b = np.random.choice([96, 36, 72, 108], size=(2, 5)) print(b)
['x' 'z' 'y' 'z' 'y'] [[ 72 108 72 96 36] [ 36 72 108 36 96]]
Если в choice() передать только массив (список), будет возвращено одно любое значение из него.
a = np.linspace(0.1, 1, 10) print(a) print(np.random.choice(a))
[0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ] 0.8
С помощью метода choice() можно сгенерировать набор случайных значений, где каждое будет представлено с определенной вероятностью (встречаться с определенной частотой). При передаче аргументов в choice() вероятности помещаются в отдельный список и присваиваются параметру p. Количество указанных вероятностей должно совпадать с количеством различных вариантов значений в массиве, который будет получен.
Вероятности указываются как дробные числа от нуля до единицы, где 0 соответствует отсутствию значения, а 1 — значению, которое встречается в массиве всегда. Сумма вероятностей должна составлять ровно единицу, иначе возникает ошибка.
a = np.random.choice([3, 5, 7, 11], size=(4, 10), p=[0.5, 0.25, 0.15, 0.1]) print(a) unique, counts = np.unique(a, return_counts=True) print(dict(zip(unique, counts)))
[[ 3 3 3 7 3 3 11 3 5 3] [ 3 7 3 3 3 5 3 11 7 5] [ 5 3 11 5 3 3 3 3 5 5] [ 3 3 7 3 5 7 3 3 5 3]] {3: 23, 5: 9, 7: 5, 11: 3}
Представьте, что вам необходим массив со всеми числами в определенном диапазоне, каждое должно встречаться один раз, но располагаться числа должны не последовательно согласно своим значениям, а быть перемешанными. Или уже готовый массив надо перетасовать (permutation — перестановка) по-новому. В этом случае используются методы shuffle (действие происходит на месте) и permutation (создается новый массив).
a = np.arange(12).reshape(4, 3) print(a) np.random.shuffle(a) print(a) b = a.flatten() print(b) c = np.random.permutation(b).reshape(4, 3) print(c)
[[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] [[ 9 10 11] [ 0 1 2] [ 3 4 5] [ 6 7 8]] [ 9 10 11 0 1 2 3 4 5 6 7 8] [[ 6 4 3] [ 9 5 0] [ 1 7 10] [11 8 2]]
В примере показано, что в многомерном массиве перетасовываются непосредственно вложенные массивы, а не их элементы. Чтобы перетасовать таковой полностью, сначала его надо разгладить (превратить в одномерный).