Spec-Zone.ru › NumPy 1.17

Случайная выборка (numpy.random)

Процедуры генерации случайных чисел в Numpy создают псевдослучайные числа, используя комбинацию BitGenerator для создания последовательностей и Generator для использования этих последовательностей для выборки из различных статистических распределений:

  • BitGenerators: Объекты, генерирующие случайные числа. Обычно это слова целых без знака, заполненные последовательностями из 32 или 64 случайных битов.
  • Generators: Объекты, преобразующие последовательности случайных битов из BitGenerator в последовательности чисел, следующих определённому вероятностному распределению (например, равномерному, нормальному или биномиальному) в заданном интервале.

С версии Numpy 1.17.0 Generator можно инициализировать различными BitGenerators. Он предоставляет множество различных вероятностных распределений. См. NEP 19 для контекста обновлённых процедур генерации случайных чисел в Numpy. Прежние процедуры генерации случайных чисел RandomState всё ещё доступны, но ограничены одним BitGenerator.

Для удобства и обратной совместимости методы отдельной инстанции RandomState импортированы в пространство имён numpy.random, см. Генерация случайных чисел (старый способ) для полного списка.

Быстрый старт

По умолчанию Generator использует биты, предоставляемые PCG64, обладающие лучшими статистическими свойствами, чем прежний генератор случайных чисел mt19937 в RandomState.

# Uses the old numpy.random.RandomState
from numpy import random
random.standard_normal()

Generator может использоваться как замена для RandomState. Оба экземпляра класса теперь содержат внутренний BitGenerator экземпляр для предоставления потока битов, доступный как gen.bit_generator. Необходимое исправление API означает, что устаревшие и совместимые методы были удалены из Generator

RandomState Generator Примечания
random_sample, random Совместимо с random.random
rand
randint, integers Добавить аргумент endpoint
random_integers
tomaxint удалено
Use integers(0, np.iinfo(np.int).max,
endpoint=False)
seed удалено Используйте spawn

См. new-or-different для получения дополнительной информации

# As replacement for RandomState(); default_rng() instantiates Generator with
# the default PCG64 BitGenerator.
from numpy.random import default_rng
rg = default_rng()
rg.standard_normal()
rg.bit_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()

Что нового или отличается

Предупреждение

Метод Box-Muller, используемый для генерации нормальных распределений в NumPy, больше не доступен в Generator. Невозможно воспроизвести точные случайные значения, используя Generator для нормального распределения или любого другого распределения, которое опирается на него, например, RandomState.gamma или RandomState.standard_t. Если вам необходимы битовые потоки обратной совместимости, используйте RandomState.

  • Функции генератора, нормальные, экспоненциальные и гамма, используют методы Зиггурата с 256 шагами, которые в 2-10 раз быстрее, чем реализации Box-Muller или обратной функции распределения NumPy.
  • Дополнительный аргумент dtype, который принимает значения np.float32 или np.float64, чтобы генерировать случайные переменные с одинарной или двойной точностью для выбранных распределений
  • Дополнительный аргумент out, который позволяет заполнять существующие массивы для выбранных распределений
  • random_entropy предоставляет доступ к системному источнику случайности, используемому в криптографических приложениях (например, /dev/urandom в Unix).
  • Все BitGenerators могут генерировать значения типа double, uint64 и uint32 через CTypes (ctypes) и CFFI (cffi). Это позволяет использовать генераторы бит в numba.
  • Генераторы бит могут использоваться в последующих проектах через Cython.
  • integers — теперь стандартный способ генерировать целые случайные числа из дискретного равномерного распределения. Методы rand и randn доступны только через устаревший RandomState. Ключевое слово endpoint может использоваться для указания открытых или закрытых интервалов. Это заменяет как randint, так и устаревший random_integers.
  • random — теперь стандартный способ генерировать случайные числа с плавающей точкой, что заменяет RandomState.random_sample, RandomState.sample, и RandomState.ranf. Это согласуется с функцией Python random.random.
  • Все BitGenerators в numpy используют SeedSequence для преобразования семян в инициализированные состояния.

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

Параллельное генерирование

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

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

Концепции

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

Функции

  • Параллельные приложения
    • SeedSequence Создание
    • Независимые потоки
    • Переход к состоянию BitGenerator
  • Многопоточная генерация
  • Что нового или изменилось
  • Сравнение производительности
    • Рекомендация
    • Измерения
    • Производительность на разных операционных системах
  • Расширение
    • Numba
    • Cython
    • Новые базовые генераторы псевдослучайных чисел
  • Чтение системной энтропии

Исходный код

Этот пакет был разработан независимо от NumPy и был интегрирован в версию 1.17.0. Исходный репозиторий находится по адресу https://github.com/bashtage/randomgen.

© 2005–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.17.0/reference/random/index.html

Spec-Zone.ru

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