Spec-Zone.ru › NumPy 1.19

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

Предупреждение

Метод Бокса-Мюллера, используемый для генерации нормальных распределений в NumPy, больше недоступен в Generator. Невозможно воспроизвести точные случайные значения, используя Generator для нормального распределения или любого другого распределения, которое зависит от нормального, такого как Generator.gamma или Generator.standard_t. Если вам нужны потоки, совместимые с предыдущими версиями в плане битовой операции, используйте RandomState, например, RandomState.gamma или RandomState.standard_t.

Быстрое сравнение устаревшего mtrand с новым Generator

Функция

Старый эквивалент

Примечания

Generator

RandomState

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

random

random_sample, rand

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

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

integers

randint, random_integers

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

И более подробно:

  • Моделирование по комплексному нормальному распределению (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

Spec-Zone.ru

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