numpy.random.Generator.multivariate_hypergeometric
метод
- random.Generator.multivariate_hypergeometric(colors, nsample, size=None, method='marginals')
-
Генерация значений из многомерного гипергеометрического распределения.
Многомерное гипергеометрическое распределение является обобщением гипергеометрического распределения.
Случайным образом выбираются
nsampleэлементов без возвращения из коллекции сNразличными типами.N— длинаcolors, а значения вcolors— количество вхождений каждого типа в коллекции. Общее количество элементов в коллекции —sum(colors). Каждое сгенерированное случайное значение — вектор длиныN, содержащий количество различных типов, встречающихся вnsampleэлементах.Название
colorsпроисходит от распространенного описания распределения: это распределение количества шариков каждого цвета, выбранных без возвращения из урны, содержащей шарики разных цветов;colors[i]— количество шариков в урне цветаi.- Параметры
-
- colorsпоследовательность целых чисел
-
Количество каждого типа элементов в коллекции, из которой выбирается выборка. Значения в
colorsдолжны быть неотрицательными. Для избежания потери точности в алгоритме,sum(colors)должно быть меньше10**9приmethodравном “marginals”. - nsampleцелое число
-
Количество выбранных элементов.
nsampleне должно превышатьsum(colors). - sizeцелое число или кортеж целых чисел, необязательно
-
Количество генерируемых значений, целое число или кортеж, определяющий форму массива значений. Если заданный размер, например,
(k, m), то генерируютсяk * mзначений, где одно значение — вектор длиныlen(colors), а возвращаемое значение имеет форму(k, m, len(colors)). Еслиsize— целое число, выходное значение имеет форму(size, len(colors)). По умолчанию None, в этом случае возвращается одно значение в виде массива с формой(len(colors),). - methodстрока, необязательно
-
Указывает алгоритм, используемый для генерации значений. Должен быть ‘count’ или ‘marginals’ (по умолчанию). См. Примечания для описания методов.
- Возвращает
-
- 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”. Если производительность алгоритма важна, протестируйте оба метода с типичными входными данными, чтобы определить, какой из них работает лучше.Введено в версии 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–2022 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.21/reference/random/generated/numpy.random.Generator.multivariate_hypergeometric.html