Что нового или изменилось
Предупреждение
Метод Бокса-Мюллера, используемый для генерации нормальных распределений в 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.
In [1]: from numpy.random import Generator, PCG64 In [2]: import numpy.random In [3]: rg = Generator(PCG64()) In [4]: %timeit -n 1 rg.standard_normal(100000) ...: %timeit -n 1 numpy.random.standard_normal(100000) ...: 1.08 ms +- 10.3 us per loop (mean +- std. dev. of 7 runs, 1 loop each) 2.08 ms +- 118 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
In [5]: %timeit -n 1 rg.standard_exponential(100000) ...: %timeit -n 1 numpy.random.standard_exponential(100000) ...: 447 us +- 6.01 us per loop (mean +- std. dev. of 7 runs, 1 loop each) 1.45 ms +- 4.65 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
In [6]: %timeit -n 1 rg.standard_gamma(3.0, 100000) ...: %timeit -n 1 numpy.random.standard_gamma(3.0, 100000) ...: 2.12 ms +- 12.7 us per loop (mean +- std. dev. of 7 runs, 1 loop each) 4.03 ms +- 62.9 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
-
integers— теперь канонический способ генерации целых случайных чисел из дискретного равномерного распределения. Методыrandиrandnдоступны только через устаревшую реализациюRandomState. Это заменяет какrandint, так и устаревший методrandom_integers. - Метод Бокса-Мюллера для генерации нормальных распределений больше не доступен.
- Все генераторы битовых последовательностей могут генерировать числа с плавающей точкой, uint64 и uint32 через CTypes (
ctypes) и CFFI (cffi). Это позволяет использовать эти генераторы в numba. - Генераторы битовых последовательностей могут быть использованы в зависимых проектах через Cython.
-
Необязательный аргумент
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)
Это позволяет использовать многопоточность для заполнения больших массивов частями с помощью подходящих генераторов битовых последовательностей параллельно.
- Равномерные распределения (
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. ]
- Необязательный аргумент
axisдля методов, таких какchoice,permutationиshuffle, который управляет осью, по которой выполняется операция для многомерных массивов.
In [13]: rg = Generator(PCG64(123456789))
In [14]: a = np.arange(12).reshape((3, 4))
In [15]: a
Out[15]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [16]: rg.choice(a, axis=1, size=5)
Out[16]:
array([[ 3, 0, 2, 3, 1],
[ 7, 4, 6, 7, 5],
[11, 8, 10, 11, 9]])
In [17]: rg.shuffle(a, axis=1) # Shuffle in-place
In [18]: a
Out[18]:
array([[ 3, 1, 2, 0],
[ 7, 5, 6, 4],
[11, 9, 10, 8]])
© 2005–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.19/reference/random/new-or-different.html