Генерация случайных чисел (numpy.random)
Процедуры генерации случайных чисел в Numpy создают псевдослучайные числа, используя комбинацию BitGenerator для создания последовательностей и Generator для использования этих последовательностей для выборки из различных статистических распределений:
- BitGenerators: Объекты, генерирующие случайные числа. Обычно это слова без знака, заполненные последовательностями из 32 или 64 случайных битов.
- Generators: Объекты, преобразующие последовательности случайных битов из BitGenerator в последовательности чисел, которые следуют определенному вероятностному распределению (например, равномерному, нормальному или биномиальному) в заданном интервале.
Начиная с версии Numpy 1.17.0, Generator может быть инициализирован с помощью различных BitGenerators. Он предоставляет множество различных вероятностных распределений. См. NEP 19 для контекста обновленных процедур генерации случайных чисел в Numpy. Устаревшие процедуры генерации случайных чисел RandomState по-прежнему доступны, но ограничены одним BitGenerator.
Для удобства и обратной совместимости методы единственного экземпляра RandomState импортированы в пространство имен numpy.random, см. Устаревшая генерация случайных чисел для полного списка.
Быстрый старт
Вызовите default_rng для получения нового экземпляра Generator, а затем вызовите его методы для получения выборок из различных распределений. По умолчанию Generator использует биты, предоставленные PCG64, у которого лучшие статистические свойства, чем устаревшее MT19937, используемое в RandomState.
# Do this from numpy.random import default_rng rng = default_rng() vals = rng.standard_normal(10) more_vals = rng.standard_normal(10) # instead of this from numpy import random vals = random.standard_normal(10) more_vals = random.standard_normal(10)
Generator может использоваться как замена RandomState. Оба экземпляра классов содержат внутренний экземпляр BitGenerator для обеспечения потока битов, к которому можно получить доступ как gen.bit_generator. Некоторые давно ожидаемые улучшения API означают, что устаревшие и совместимые методы были удалены из Generator
Примечания | ||
|
| Совместимо с |
| ||
|
| Добавить аргумент |
| ||
| удалено | Используйте |
| удалено | Используйте |
См. Что нового или отличается для получения дополнительной информации
Для поддержки как RandomState , так и Generator можно использовать код, подобный следующему, с пониманием того, что интерфейсы немного отличаются
try:
rg_integers = rg.integers
except AttributeError:
rg_integers = rg.randint
a = rg_integers(1000)
Семена могут быть переданы любому из BitGenerators. Предоставленное значение смешивается с помощью SeedSequence для распространения возможной последовательности семян по более широкому диапазону начальных состояний для BitGenerator. Здесь используется PCG64, который обернут в Generator.
from numpy.random import Generator, PCG64 rg = Generator(PCG64(12345)) rg.standard_normal()
Введение
Новая инфраструктура использует другой подход к генерации случайных чисел по сравнению с объектом RandomState. Генерация случайных чисел разделена на два компонента: генератор битов и генератор случайных чисел.
У BitGenerator ограниченный набор задач. Он управляет состоянием и предоставляет функции для получения случайных чисел с плавающей точкой двойной точности и случайных значений без знака 32 и 64 битов.
random generator принимает поток, предоставленный генератором битов, и преобразует их в более полезные распределения, например, значения случайных чисел, смоделированных по нормальному закону. Эта структура позволяет использовать альтернативные генераторы битов с минимальным дублированием кода.
Generator — это объект, с которым работает пользователь, практически идентичный RandomState. Стандартный метод инициализации генератора — передача генератора битов PCG64 в качестве единственного аргумента.
from numpy.random import default_rng rg = default_rng(12345) rg.random()
Также можно напрямую инициализировать Generator с помощью экземпляра BitGenerator. Для использования устаревшего алгоритма MT19937, можно напрямую инициализировать его и передать в Generator.
from numpy.random import Generator, MT19937 rg = Generator(MT19937(12345)) rg.random()
Что нового или отличается
Предупреждение
Метод Бокса-Мюллера, используемый для генерации нормальных распределений в NumPy, больше недоступен в Generator. Невозможно воспроизвести точные случайные значения, используя Generator для нормального распределения или любого другого распределения, которое использует нормальное, например, RandomState.gamma или RandomState.standard_t. Если вам требуются битово совместимые потоки, используйте RandomState.
- Функции генератора, нормальные, экспоненциальные и гамма, используют методы Зиггурата с 256 шагами, которые в 2-10 раз быстрее, чем реализации NumPy's Box-Muller или обратного преобразования функции распределения.
- Необязательный аргумент
dtype, который принимаетnp.float32илиnp.float64, для получения одно- или двойной точности равномерных случайных переменных для выбранных распределений - Необязательный аргумент
out, который позволяет заполнять существующие массивы для выбранных распределений - Все BitGenerators могут генерировать значения с плавающей запятой, uint64 и uint32 через CTypes (
PCG64.ctypes) и CFFI (PCG64.cffi). Это позволяет использовать генераторы битов в numba. - Генераторы битов могут использоваться в проектах ниже по потоку через Cython.
-
Generator.integers— теперь канонический способ генерации целых случайных чисел из дискретного равномерного распределения. Методыrandиrandnдоступны только через устаревшуюRandomState. Ключевое словоendpointможет использоваться для указания открытых или закрытых интервалов. Это заменяет какrandint, так и устаревшийrandom_integers. -
Generator.randomтеперь является каноническим способом генерации случайных чисел с плавающей запятой, что заменяетRandomState.random_sample,RandomState.sample, иRandomState.ranf. Это согласуется с функцией Python'srandom.random. - Все BitGenerators в numpy используют
SeedSequenceдля преобразования семян в инициализированные состояния. - Добавление ключевого аргумента
axisк таким методам, какGenerator.choice,Generator.permutation, иGenerator.shuffle, улучшает поддержку выборки и перемешивания многомерных массивов.
Полный список улучшений и отличий от традиционного Randomstate см. в Новом или изменённом.
Параллельная генерация
Включенные генераторы могут быть использованы в параллельных распределённых приложениях тремя способами:
Концепции
- Генератор случайных чисел
- Устаревший генератор (RandomState)
- Генераторы битов
- Инициализация и энтропия
Функции
- Параллельные приложения
- Многопоточная генерация
- Новое или изменённое
- Сравнение производительности
- Cython API для случайных чисел
- C API для случайных чисел
- Примеры использования Numba, Cython, CFFI
Исходный источник генератора и BitGenerators
Этот пакет был разработан независимо от NumPy и был интегрирован в версию 1.17.0. Исходный репозиторий находится по адресу https://github.com/bashtage/randomgen.
© 2005–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.19/reference/random/index.html