NumPy, часть 3: random

Здравствуйте! Я продолжаю работу над пособием по python-библиотеке NumPy.

В прошлой части мы научились работать с массивами.

Сегодня мы узнаем, как создавать массивы из случайных элементов и как работать со случайными элементами в NumPy.

Путь первый

Создавать списки, используя встроенный модуль random, а затем преобразовывать их в numpy.array:

>>> import numpy as np
>>> import random
>>> np.array([random.random() for i in range(10)])
array([ 0.99538667,  0.16860511,  0.78952804,  0.09676316,  0.86110208,
        0.89674666,  0.56401347,  0.63431468,  0.51110935,  0.64944844])

Но есть способ лучше.

numpy.random

Для создания массивов со случайными элементами служит модуль numpy.random.

>>> import numpy as np  # Импортировать numpy и писать np.random
>>> np.random
<module 'numpy.random' from '/usr/local/lib/python3.4/dist-packages/numpy/random/__init__.py'>
>>> import numpy.random as rand  # Можно и присвоить отдельное имя. Вопрос вкуса
>>> rand
<module 'numpy.random' from '/usr/local/lib/python3.4/dist-packages/numpy/random/__init__.py'>

Создание массивов

Самый простой способ задать массив со случайными элементами - использовать функцию sample (или random, или random_sample, или ranf - это всё одна и та же функция).

>>> np.random.sample()
0.6336371838734877
>>> np.random.sample(3)
array([ 0.53478558,  0.1441317 ,  0.15711313])
>>> np.random.sample((2, 3))
array([[ 0.12915769,  0.09448946,  0.58778985],
       [ 0.45488207,  0.19335243,  0.22129977]])

Без аргументов возвращает просто число в промежутке [0, 1), с одним целым числом - одномерный массив, с кортежем - массив с размерами, указанными в кортеже (все числа - из промежутка [0, 1)).

С помощью функции randint или random_integers можно создать массив из целых чисел. Аргументы: low, high, size: от какого, до какого числа (randint не включает в себя это число, а random_integers включает), и size - размеры массива.

>>> np.random.randint(0, 3, 10)
array([0, 2, 0, 1, 1, 0, 2, 2, 2, 0])
>>> np.random.random_integers(0, 3, 10)
array([2, 2, 3, 3, 1, 1, 0, 2, 3, 2])
>>> np.random.randint(0, 3, (2, 10))
array([[0, 1, 2, 0, 0, 0, 1, 1, 1, 2],
       [0, 0, 2, 2, 2, 0, 1, 2, 2, 1]])

Также можно генерировать числа согласно различным распределениям (Гаусса, Парето и другие). Чаще всего нужно равномерное распределение, которое можно получить с помощь функции uniform.

>>> np.random.uniform(2, 8, (2, 10))
array([[ 3.1517914 ,  3.10313483,  2.84007134,  3.21556436,  4.64531786,
         2.99232714,  7.03064897,  4.38691765,  5.27488548,  2.63472454],
       [ 6.39470358,  5.63084131,  4.69996748,  7.07260546,  7.44340813,
         4.10722203,  7.52956646,  4.8596943 ,  3.97923973,  5.64505363]])

Выбор и перемешивание

Перемешать NumPy массив можно с помощью функции shuffle:

>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.random.shuffle(a)
>>> a
array([2, 8, 7, 3, 5, 0, 4, 9, 1, 6])

Также можно перемешать массив с помощью функции permutation (она, в отличие от shuffle, возвращает перемешанный массив). Также она, вызванная с одним аргументом (целым числом), возвращает перемешанную последовательность от 0 до N.

>>> np.random.permutation(10)
array([1, 2, 3, 8, 7, 9, 4, 6, 5, 0])

Сделать случайную выборку из массива можно с помощью функции choice. Про неё стоит рассказать подробнее.

numpy.random.choice(a, size=None, replace=True, p=None)

  • a : одномерный массив или число. Если массив, будет производиться выборка из него. Если число, то выборка будет производиться из np.arange(a).
  • size : размерности массива. Если None, возвращается одно значение.
  • replace : если True, то одно значение может выбираться более одного раза.
  • p : вероятности. Это означает, что элементы можно выбирать с неравными вероятностями. Если не заданы, используется равномерное распределение.
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.random.choice(a, 10, p=[0.5, 0.25, 0.25, 0, 0, 0, 0, 0, 0, 0])
array([0, 0, 0, 0, 1, 2, 0, 0, 1, 1])

Инициализация генератора случайных чисел

seed(число) - инициализация генератора.

>>> np.random.seed(1000)
>>> np.random.random(10)
array([ 0.65358959,  0.11500694,  0.95028286,  0.4821914 ,  0.87247454,
        0.21233268,  0.04070962,  0.39719446,  0.2331322 ,  0.84174072])
>>> np.random.seed(1000)
>>> np.random.random(10)
array([ 0.65358959,  0.11500694,  0.95028286,  0.4821914 ,  0.87247454,
        0.21233268,  0.04070962,  0.39719446,  0.2331322 ,  0.84174072])

get_state и set_state - возвращают и устанавливают состояние генератора.

>>> np.random.seed(1000)
>>> state = np.random.get_state()
>>> np.random.random(10)
array([ 0.65358959,  0.11500694,  0.95028286,  0.4821914 ,  0.87247454,
        0.21233268,  0.04070962,  0.39719446,  0.2331322 ,  0.84174072])
>>> np.random.set_state(state)
>>> np.random.random(10)
array([ 0.65358959,  0.11500694,  0.95028286,  0.4821914 ,  0.87247454,
        0.21233268,  0.04070962,  0.39719446,  0.2331322 ,  0.84174072])

Обсуждение вопросов, не связанных со статьёй (в т.ч. комментарии типа "Помогите!"), ведётся на форуме pythonworld.club, а не в комментариях.

Для вставки кода на Python в комментарий заключайте его в теги <pre><code class="python3">Ваш код</code></pre>
Опечатка в тексте:
Послать сообщение об ошибке автору?