Что нового или изменилось
В NumPy 1.17.0 был представлен Generator как улучшенная замена для старого RandomState. Вот быстрое сравнение двух реализаций.
Функция | Старый аналог | Примечания |
| ||
|
Доступ к значениям в генераторе, преобразование их в Поддерживаются и многие другие распределения. | ||
Используйте параметр |
- Генераторы нормального, экспоненциального и гамма-распределений используют методы Зиггурата с 256 шагами, которые в 2-10 раз быстрее, чем реализация NumPy по умолчанию в
standard_normal,standard_exponentialилиstandard_gamma. Из-за изменения алгоритмов невозможно воспроизвести точные случайные значения с помощьюGeneratorдля этих распределений или любого метода распределения, который на них полагается.
In [1]: import numpy.random In [2]: rng = np.random.default_rng() In [3]: %timeit -n 1 rng.standard_normal(100000) ...: %timeit -n 1 numpy.random.standard_normal(100000) ...: 455 us +- 17.1 us per loop (mean +- std. dev. of 7 runs, 1 loop each) 1.3 ms +- 17.8 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
In [4]: %timeit -n 1 rng.standard_exponential(100000) ...: %timeit -n 1 numpy.random.standard_exponential(100000) ...: 458 us +- 1.49 us per loop (mean +- std. dev. of 7 runs, 1 loop each) 1.03 ms +- 5.38 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
In [5]: %timeit -n 1 rng.standard_gamma(3.0, 100000) ...: %timeit -n 1 numpy.random.standard_gamma(3.0, 100000) ...: 1.15 ms +- 15.2 us per loop (mean +- std. dev. of 7 runs, 1 loop each) 2.26 ms +- 14.9 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
-
integersтеперь является стандартным способом генерации целых случайных чисел из дискретного равномерного распределения. Это заменяет какrandint, так и устаревшийrandom_integers. - Методы
randиrandnдоступны только через устаревшуюRandomState. -
Generator.randomтеперь является стандартным способом генерации случайных чисел с плавающей точкой, заменяяRandomState.random_sample,sampleиranf, которые являлись псевдонимами. Это соответствует Pythonrandom.random. - Все генераторы бит могут производить значения с двойной точностью, uint64 и uint32 через CTypes (
ctypes) и CFFI (cffi). Это позволяет использовать эти генераторы бит в numba. - Генераторы бит могут использоваться в проектах ниже по потоку через Cython.
- Все генераторы бит используют
SeedSequenceдля преобразования целых чисел семян в инициализированные состояния. -
Необязательный параметр
dtype, который принимаетnp.float32илиnp.float64для получения случайных переменных равномерного распределения одинарной или двойной точности для определенных распределений.integersпринимает параметрdtypeс любым целочисленным типом данных со знаком или без знака.- Равномерные (
randomиintegers) - Нормальные (
standard_normal) - Стандартные гамма-распределения (
standard_gamma) - Стандартные экспоненциальные распределения (
standard_exponential)
- Равномерные (
In [6]: rng = np.random.default_rng() In [7]: rng.random(3, dtype=np.float64) Out[7]: array([0.38384469, 0.708575 , 0.56572287]) In [8]: rng.random(3, dtype=np.float32) Out[8]: array([0.23382288, 0.1098206 , 0.317388 ], dtype=float32) In [9]: rng.integers(0, 256, size=3, dtype=np.uint8) Out[9]: array([ 34, 243, 94], dtype=uint8)
-
Необязательный параметр
out, который позволяет заполнять существующие массивы для определенных распределений- Равномерные (
random) - Нормальные (
standard_normal) - Стандартные гамма-распределения (
standard_gamma) - Стандартные экспоненциальные распределения (
standard_exponential)
Это позволяет выполнять многопоточное заполнение больших массивов частями с помощью подходящих генераторов бит параллельно.
- Равномерные (
In [10]: rng = np.random.default_rng() In [11]: existing = np.zeros(4) In [12]: rng.random(out=existing[:2]) Out[12]: array([0.7476536 , 0.21406269]) In [13]: print(existing) [0.7476536 0.21406269 0. 0. ]
- Необязательный параметр
axisдля методов, таких какchoice,permutationиshuffle, который управляет осью, по которой выполняется операция для многомерных массивов.
In [14]: rng = np.random.default_rng()
In [15]: a = np.arange(12).reshape((3, 4))
In [16]: a
Out[16]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [17]: rng.choice(a, axis=1, size=5)
Out[17]:
array([[ 1, 2, 0, 3, 1],
[ 5, 6, 4, 7, 5],
[ 9, 10, 8, 11, 9]])
In [18]: rng.shuffle(a, axis=1) # Shuffle in-place
In [19]: a
Out[19]:
array([[ 2, 0, 3, 1],
[ 6, 4, 7, 5],
[10, 8, 11, 9]])
- Добавлен метод для выборки из комплексного нормального распределения (
complex_normal)
© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/random/new-or-different.html