numpy.random.Generator.multivariate_hypergeometric#
方法
- random.Generator.multivariate_hypergeometric(colors, nsample, size=None, method='marginals')#
从多元超几何分布生成随机数。
多元超几何分布是超几何分布的推广。
从一个包含
N
种不同类型的集合中无放回地随机抽取nsample
个项目。N
是colors
的长度,colors
中的值表示集合中该类型的出现次数。集合中的项目总数为sum(colors)
。该函数生成的每个随机数都是一个长度为N
的向量,包含在nsample
个项目中出现的不同类型的计数。名称
colors
来自对该分布的常见描述:它是从一个装有不同颜色弹珠的瓮中无放回地抽取的弹珠数量的概率分布;colors[i]
是瓮中颜色为i
的弹珠数量。- 参数::
- colors整数序列
从其抽取样本的集合中每种类型的项目数量。
colors
中的值必须是非负数。为了避免算法中的精度损失,当 method 为“marginals”时,sum(colors)
必须小于10**9
。- nsampleint
选取的项目数量。
nsample
不能大于sum(colors)
。- sizeint 或 int 元组,可选
要生成的随机数数量,可以是整数或包含随机数数组形状的元组。如果给定大小为,例如
(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]]])