Случайная выборка (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, с пониманием, что интерфейсы немного отличаются
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'srandom.random. - Все BitGenerators в numpy используют
SeedSequenceдля преобразования семян в инициализированные состояния. - Добавление ключевого аргумента
axisк таким методам, какGenerator.choice,Generator.permutation, иGenerator.shuffleулучшает поддержку выборки и перемешивания многомерных массивов.
См. Что нового или отличается для полного списка улучшений и различий с традиционной Randomstate.
Параллельная генерация
Включенные генераторы могут быть использованы в параллельных, распределенных приложениях тремя способами:
Пользователи с очень большой степенью параллелизма должны обратиться к Модернизация PCG64 с PCG64DXSM.
Концепции
- Генератор случайных чисел
- Устаревший генератор (RandomState)
- Генераторы битов
- Инициализация и энтропия
- Модернизация PCG64 с PCG64DXSM
Особенности
- Параллельные приложения
- Многопотоковая генерация
- Что нового или отличается
- Сравнение производительности
- C API для случайных чисел
- Примеры использования 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