Что нового или изменилось
Предупреждение
Метод Box-Muller, используемый для генерации нормальных распределений в NumPy, больше недоступен в Generator. Невозможно воспроизвести точные случайные значения, используя Generator для нормального распределения или любого другого распределения, которое зависит от нормального, например, Generator.gamma или Generator.standard_t. Если вам необходимы потоки с обратной совместимостью по битам, используйте RandomState, например, RandomState.gamma или RandomState.standard_t.
Быстрое сравнение устаревшего mtrand с новым Generator
Функция | Старый эквивалент | Примечания |
| ||
|
|
Доступ к значениям в BitGenerator, конвертация их в Поддерживается множество других распределений. |
|
| Используйте аргумент |
И более подробно:
- Моделирование из комплексного нормального распределения (
complex_normal) - Генераторы нормального, экспоненциального и гамма-распределений используют 256-шаговые методы Зиггурата, которые в 2-10 раз быстрее, чем реализация NumPy по умолчанию в
standard_normal,standard_exponentialилиstandard_gamma. -
integers— теперь канонический способ генерации целочисленных случайных чисел из дискретного равномерного распределения. Методыrandиrandnдоступны только через устаревшийRandomState. Это заменяет иrandint, и устаревшийrandom_integers. - Метод Box-Muller для генерации нормальных распределений больше недоступен.
- Все генераторы битов могут генерировать double, uint64 и uint32 через CTypes (
ctypes) и CFFI (cffi). Это позволяет использовать эти генераторы битов в numba. - Генераторы битов могут быть использованы в последующих проектах с помощью Cython.
In [1]: from numpy.random import Generator, PCG64 In [2]: import numpy.random In [3]: rg = Generator(PCG64()) In [4]: %timeit rg.standard_normal(100000) ...: %timeit numpy.random.standard_normal(100000) ...: 1 ms +- 2.11 us per loop (mean +- std. dev. of 7 runs, 1000 loops each) 1.81 ms +- 12.7 us per loop (mean +- std. dev. of 7 runs, 1000 loops each)
In [5]: %timeit rg.standard_exponential(100000) ...: %timeit numpy.random.standard_exponential(100000) ...: 382 us +- 448 ns per loop (mean +- std. dev. of 7 runs, 1000 loops each) 1.33 ms +- 979 ns per loop (mean +- std. dev. of 7 runs, 1000 loops each)
In [6]: %timeit rg.standard_gamma(3.0, 100000) ...: %timeit numpy.random.standard_gamma(3.0, 100000) ...: 1.86 ms +- 1.54 us per loop (mean +- std. dev. of 7 runs, 1000 loops each) 3.6 ms +- 17 us per loop (mean +- std. dev. of 7 runs, 100 loops each)
-
Необязательный аргумент
dtype, принимающийnp.float32илиnp.float64, чтобы получить случайные переменные с одинарной или двойной точностью для выбранных распределений- Равномерные (
randomиintegers) - Нормальные (
standard_normal) - Стандартные Гамма (
standard_gamma) - Стандартные Экспоненциальные (
standard_exponential)
- Равномерные (
In [7]: rg = Generator(PCG64(0)) In [8]: rg.random(3, dtype='d') Out[8]: array([0.63696169, 0.26978671, 0.04097352]) In [9]: rg.random(3, dtype='f') Out[9]: array([0.07524014, 0.01652753, 0.17526722], dtype=float32)
-
Необязательный аргумент
out, позволяющий заполнять существующие массивы для выбранных распределений- Равномерные (
random) - Нормальные (
standard_normal) - Стандартные Гамма (
standard_gamma) - Стандартные Экспоненциальные (
standard_exponential)
Это позволяет использовать многопоточность для заполнения больших массивов частями с помощью подходящих генераторов BitGenerators параллельно.
- Равномерные (
In [10]: existing = np.zeros(4) In [11]: rg.random(out=existing[:2]) Out[11]: array([0.91275558, 0.60663578]) In [12]: print(existing) [0.91275558 0.60663578 0. 0. ]
© 2005–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.18/reference/random/new-or-different.html