numpy.random.Generator.multivariate_hypergeometric
method
-
Generator.multivariate_hypergeometric(colors, nsample, size=None, method='marginals') -
Генерация значений из многомерного гипергеометрического распределения.
Многомерное гипергеометрическое распределение является обобщением гипергеометрического распределения.
Случайно выбираются
nsampleэлементов без возвращения из множества сNразличными типами.N— длинаcolors, а значения вcolors— количество вхождений каждого типа в множестве. Общее количество элементов в множестве —sum(colors). Каждое генерируемое случайное значение — это вектор длинойN, содержащий счётчики различных типов, присутствующих вnsampleвыбранных элементах.Название
colorsпроисходит из распространённого описания распределения: это распределение количества шаров каждого цвета, выбранных без возвращения из урны, содержащей шары разных цветов;colors[i]— количество шаров в урне цветаi.- Parameters
-
-
colorssequence of integers -
Количество каждого типа элементов в множестве, из которого производится выборка. Значения в
colorsдолжны быть неотрицательными. Для избежания потери точности в алгоритме,sum(colors)должно быть меньше10**9приmethodравном “marginals”. -
nsampleint -
Количество выбранных элементов.
nsampleне должно быть большеsum(colors). -
sizeint or tuple of ints, optional -
Количество генерируемых значений, либо целое число, либо кортеж, определяющий форму массива значений. Если заданный размер, например,
(k, m), то генерируютсяk * mзначений, где каждое значение — это вектор длинойlen(colors), а возвращаемое значение имеет форму(k, m, len(colors)). Еслиsize— целое число, то выходное значение имеет форму(size, len(colors)). По умолчанию None, в этом случае возвращается одно значение в виде массива с формой(len(colors),). -
methodstring, optional -
Указывает алгоритм генерации значений. Должно быть ‘count’ или ‘marginals’ (по умолчанию). См. Примечания для описания методов.
-
- Returns
-
-
variatesndarray -
Массив значений, сгенерированных из многомерного гипергеометрического распределения.
-
См. также
-
hypergeometric -
Генерация значений из (одномерного) гипергеометрического распределения.
Примечания
Два метода не возвращают одинаковую последовательность значений.
Алгоритм “count” примерно эквивалентен следующему коду NumPy:
choices = np.repeat(np.arange(len(colors)), colors) selection = np.random.choice(choices, nsample, replace=False) variate = np.bincount(selection, minlength=len(colors))
Алгоритм “count” использует временный массив целых чисел длиной
sum(colors).Алгоритм “marginals” генерирует значение, используя повторные вызовы одномерного генератора гипергеометрических значений. Он примерно эквивалентен:
variate = np.zeros(len(colors), dtype=np.int64) # `remaining` is the cumulative sum of `colors` from the last # element to the first; e.g. if `colors` is [3, 1, 5], then # `remaining` is [9, 6, 5]. remaining = np.cumsum(colors[::-1])[::-1] for i in range(len(colors)-1): if nsample < 1: break variate[i] = hypergeometric(colors[i], remaining[i+1], nsample) nsample -= variate[i] variate[-1] = nsampleПо умолчанию используется метод “marginals”. В некоторых случаях (например, когда
colorsсодержит относительно небольшие целые числа), метод “count” может быть значительно быстрее метода “marginals”. Если производительность алгоритма важна, протестируйте оба метода с типичными входными данными, чтобы определить, какой из них лучше работает.New in version 1.18.0.
Примеры
>>> colors = [16, 8, 4] >>> seed = 4861946401452 >>> gen = np.random.Generator(np.random.PCG64(seed)) >>> gen.multivariate_hypergeometric(colors, 6) array([5, 0, 1]) >>> gen.multivariate_hypergeometric(colors, 6, size=3) array([[5, 0, 1], [2, 2, 2], [3, 3, 0]]) >>> gen.multivariate_hypergeometric(colors, 6, size=(2, 2)) array([[[3, 2, 1], [3, 2, 1]], [[4, 1, 1], [3, 2, 1]]])
© 2005–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.18/reference/random/generated/numpy.random.Generator.multivariate_hypergeometric.html