Spec-Zone.ru › NumPy 1.18

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

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

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

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

Функция

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

Примечания

Generator

RandomState

Generator требует источника потока, называемого BitGenerator. Несколько таких источников предоставляется. RandomState по умолчанию использует генератор Mersenne Twister 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.
  • 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

Spec-Zone.ru

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