Spec-Zone.ru › NumPy 1.19

Генерация случайных чисел (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

Примечания

random_sample,

random

Совместимо с random.random

rand

randint,

integers

Добавить аргумент endpoint

random_integers

tomaxint

удалено

Используйте integers(0, np.iinfo(np.int_).max, endpoint=False)

seed

удалено

Используйте SeedSequence.spawn

См. Что нового или отличается для получения дополнительной информации

Для поддержки как 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's random.random.
  • Все BitGenerators в numpy используют SeedSequence для преобразования семян в инициализированные состояния.
  • Добавление ключевого аргумента axis к таким методам, как Generator.choice, Generator.permutation, и Generator.shuffle, улучшает поддержку выборки и перемешивания многомерных массивов.

Полный список улучшений и отличий от традиционного Randomstate см. в Новом или изменённом.

Параллельная генерация

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

  • Генерация SeedSequence
  • Независимые потоки
  • Переход к состоянию BitGenerator

Концепции

  • Генератор случайных чисел
  • Устаревший генератор (RandomState)
  • Генераторы битов
  • Инициализация и энтропия

Функции

  • Параллельные приложения
    • SeedSequence генерация
    • Независимые потоки
    • Переход к состоянию BitGenerator
  • Многопоточная генерация
  • Новое или изменённое
  • Сравнение производительности
    • Рекомендация
    • Замеры времени
    • Производительность на разных операционных системах
  • Cython API для случайных чисел
  • C API для случайных чисел
  • Примеры использования Numba, Cython, CFFI
    • 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API