我需要从一个数字列表中生成样本,在这种情况下,我可能需要采样比我拥有的更多的数字。更明确地说,这是我需要做的:
令我的列表中的元素总数为 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/