python - 当需要抽样的数量多于样本数量时,不放回地随机抽样

标签 python numpy sampling

我需要从一个数字列表中生成样本,在这种情况下,我可能需要采样比我拥有的更多的数字。更明确地说,这是我需要做的:

  • 令我的列表中的元素总数为 N。

  • 我需要从这个列表 M 个样本中随机抽取无放回样本。

  • 如果 M <= N,则只需使用 Numpy 的 random.choice,无需替换。

  • 如果 M > N,则样本必须包含 X 乘以列表中的所有 N 个数字,其中 X 是 N 完全除以 M 的次数,即 X = floor(M/N) 然后样本列表中额外的 M-(X*N) 个剩余样本,无需替换。

例如,让我的列表如下:

L = [1, 2, 3, 4, 5]

我需要采样 8 个样本。然后首先,我对完整列表进行一次采样,然后随机添加 3 个元素而不进行替换,例如我的样本可能是:

Sampled_list = [1, 2, 3, 4, 5, 3, 5, 1]

如何在 Python 的计算时间方面尽可能高效地实现这样的代码?这可以在没有 for 循环的情况下完成吗?

目前我正在使用 for 循环实现它,但这对我的目的来说效率太低了。我也试过 Numpy 的 random.choice 没有替换,但我需要有 M <= N。

感谢您的帮助!

最佳答案

您可以 concatenate repeat的结果和 random.choice :

np.concatenate((np.repeat(L, M // len(L)), np.random.choice(L, M - M // len(L))))

首先,根据需要重复序列,然后选择所需的剩余数量;最后,将两个数组连接起来。

请注意,您可以使用 replace parameter 轻松确定 choice 是否适用于替换。 :

replace : boolean, optional -- Whether the sample is with or without replacement

关于python - 当需要抽样的数量多于样本数量时,不放回地随机抽样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39507118/

相关文章:

python - 如何在 Python 中继续进行拉丁超立方体采样?

python - 我应该如何将充满小数的数据框转换为 float ?

python - 为 Tk().iconbitmap() 使用类似对象的文件

python - 从 List 中查找具有 key 对 'isGeo' :True 的字典

python - Pandas:应用滚动函数来计算新的列值

python - numpy.random.choice 中的替换是什么意思?

algorithm - 生成唯一(非重复)随机数的高效算法

python - 完美正方形 leetcode 缺少带有递归解决方案的测试用例

python - 使用已弃用的 Numpy API

python - 简化行和列提取,numpy