Spec-Zone.ru › NumPy 2.0

Что нового или изменилось

В NumPy 1.17.0 был представлен Generator как улучшенная замена для старого RandomState. Вот быстрое сравнение двух реализаций.

Функция

Старый аналог

Примечания

Generator

RandomState

Generator требует источника потока, называемого BitGenerator. Доступно несколько таких источников. RandomState по умолчанию использует генератор Мерсенна Твистер MT19937, но также может быть инициирован с любым генератором.

random

random_sample, rand

Доступ к значениям в генераторе, преобразование их в float64 в интервале [0.0., 1.0). Помимо параметра size, теперь поддерживает dtype='d' или dtype='f', и параметр out для заполнения предоставленного пользователем массива.

Поддерживаются и многие другие распределения.

integers

randint, random_integers

Используйте параметр endpoint для изменения включения или исключения конечной точки интервала high.

  • Генераторы нормального, экспоненциального и гамма-распределений используют методы Зиггурата с 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, которые являлись псевдонимами. Это соответствует Python random.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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API