Spec-Zone.ru › NumPy 1.21

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

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

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

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

Для удобства и обратной совместимости методы единственного экземпляра RandomState импортируются в пространство имён numpy.random, см. Устаревшая генерация случайных чисел для полного списка.

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

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

# Do this (new version)
from numpy.random import default_rng
rng = default_rng()
vals = rng.standard_normal(10)
more_vals = rng.standard_normal(10)

# instead of this (legacy version)
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 kwarg

random_integers

tomaxint

удалено

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

seed

удалено

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

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

Следующий код может использоваться для поддержки как RandomState , так и Generator, с пониманием, что интерфейсы немного отличаются

try:
    rng_integers = rng.integers
except AttributeError:
    rng_integers = rng.randint
a = rng_integers(1000)

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

from numpy.random import Generator, PCG64
rng = Generator(PCG64(12345))
rng.standard_normal()

Здесь мы используем default_rng для создания экземпляра Generator для генерации случайного числа с плавающей точкой:

>>> import numpy as np
>>> rng = np.random.default_rng(12345)
>>> print(rng)
Generator(PCG64)
>>> rfloat = rng.random()
>>> rfloat
0.22733602246716966
>>> type(rfloat)
<class 'float'>

Здесь мы используем default_rng для создания экземпляра Generator для генерации 3 случайных целых чисел в диапазоне от 0 (включительно) до 10 (исключительно):

>>> import numpy as np
>>> rng = np.random.default_rng(12345)
>>> rints = rng.integers(low=0, high=10, size=3)
>>> rints
array([6, 2, 7])
>>> type(rints[0])
<class 'numpy.int64'>

Введение

Новая инфраструктура использует другой подход к генерации случайных чисел по сравнению с объектом RandomState. Генерация случайных чисел разделена на два компонента: генератор битов и генератор случайных чисел.

У BitGenerator ограниченный набор задач. Он управляет состоянием и предоставляет функции для генерации случайных чисел с плавающей точкой и случайных значений без знака 32 и 64 битов.

random generator принимает поток, предоставленный генератором битов, и преобразует их в более полезные распределения, например, генерирует случайные нормальные значения. Эта структура позволяет использовать альтернативные генераторы битов с небольшим дублированием кода.

Generator — это объект, с которым работает пользователь, почти идентичный устаревшему RandomState. Он принимает экземпляр генератора битов в качестве аргумента. По умолчанию в настоящее время используется PCG64, но это может измениться в будущих версиях. Для удобства NumPy предоставляет функцию default_rng, чтобы скрыть эти детали:

>>> from numpy.random import default_rng
>>> rng = default_rng(12345)
>>> print(rng)
Generator(PCG64)
>>> print(rng.random())
0.22733602246716966

Также можно напрямую инициализировать Generator с экземпляром BitGenerator.

Для использования по умолчанию генератора битов PCG64, можно инициализировать его напрямую и передать в Generator:

>>> from numpy.random import Generator, PCG64
>>> rng = Generator(PCG64(12345))
>>> print(rng)
Generator(PCG64)

Аналогично, для использования устаревшего генератора битов MT19937 (не рекомендуется), можно инициализировать его напрямую и передать в Generator:

>>> from numpy.random import Generator, MT19937
>>> rng = Generator(MT19937(12345))
>>> print(rng)
Generator(MT19937)

Что нового или изменилось

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

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

  • Функции генератора, нормальные, экспоненциальные и гамма, используют методы Зиггурата с 256 шагами, которые в 2-10 раз быстрее, чем реализации NumPy 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

Пользователи с очень большой степенью параллелизма должны обратиться к Модернизация PCG64 с PCG64DXSM.

Концепции

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

Особенности

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

Исходный источник генератора и генераторов битов

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

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

Spec-Zone.ru

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