Случайная выборка (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()
Что нового или изменилось
Предупреждение
Метод Box-Muller, используемый для получения нормальных распределений NumPy, больше недоступен в Generator. Невозможно воспроизвести точные случайные значения с помощью Generator для нормального распределения или любого другого распределения, которое зависит от нормального распределения, например, RandomState.gamma или RandomState.standard_t. Если вам необходимы битово-совместимые потоки, используйте RandomState.
- Функции генератора, нормальные, экспоненциальные и гамма-функции, используют методы Зиггурата с 256 шагами, которые в 2-10 раз быстрее, чем реализации Box-Muller или обратной функции распределения NumPy.
- Дополнительный аргумент
dtype, который принимает значенияnp.float32илиnp.float64, чтобы генерировать одно- или двойной точности равномерные случайные величины для выбранных распределений - Дополнительный аргумент
out, который позволяет заполнять существующие массивы для выбранных распределений - Все генераторы бит могут генерировать значения с двойной точностью, 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. Это согласуется с функциейrandom.randomPython. - Все генераторы бит в numpy используют
SeedSequenceдля преобразования семян в инициализированные состояния.
См. Что нового или отличается для полного списка улучшений и отличий от традиционной Randomstate.
Параллельная генерация
Включенные генераторы могут быть использованы в параллельных, распределенных приложениях тремя способами:
Концепции
- Генератор случайных чисел
- Устаревший генератор (RandomState)
- Генераторы бит
- Инициализация и энтропия
Функции
- Приложения для параллельной обработки
- Многопоточная генерация
- Что нового или отличается
- Сравнение производительности
- Cython API для случайных чисел
- C API для случайных чисел
- Примеры использования Numba, Cython, CFFI
Исходный код генератора и генераторов бит
Этот пакет был разработан независимо от 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.18/reference/random/index.html