在 Python 中重复采样

S. *_*rum 8 python

我有一个包含 50 个元素的字符串,我需要随机化它并生成一个更长的字符串,我发现random.sample()只选择独特的元素,这很好但不适合我的目的,有没有办法允许在 Python 中重复或我需要多次建立一个循环?

Eng*_*ero 10

您可以使用numpy.random.choice. 它有一个参数来指定你想要多少样本,还有一个参数来指定你是否想要替换。像下面这样的东西应该可以工作。

import numpy as np
choices = np.random.choice([1, 2, 3], size=10, replace=True)
# array([2, 1, 2, 3, 3, 1, 2, 2, 3, 2])
Run Code Online (Sandbox Code Playgroud)

如果您的输入是字符串,请说类似my_string = 'abc',您可以使用:

choices = np.random.choice([char for char in my_string], size=10, replace=True)
# array(['c', 'b', 'b', 'c', 'b', 'a', 'a', 'a', 'c', 'c'], dtype='<U1')
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令从中获取一个新字符串:

new_string = ''.join(choices)
# 'cbbcbaaacc'
Run Code Online (Sandbox Code Playgroud)

表现

对到目前为止的三个答案进行计时,并random.choices从注释(''.join因为我们都使用过它而跳过该部分)从 string 生成 1000 个样本'abc',我们得到:

  • numpy.random.choice([char for char in 'abc'], size=1000, replace=True)

    每个循环 34.1 µs ± 213 ns(7 次运行的平均值 ± 标准偏差,每次 10000 次循环)

  • random.choices('abc', k=1000)

    每个循环 269 µs ± 4.27 µs(平均值 ± 标准偏差,7 次运行,每次 1000 次循环)

  • [random.choice('abc') for _ in range(1000)]

    每个循环 924 µs ± 10.4 µs(7 次运行的平均值 ± 标准偏差,每次 1000 次循环)

  • [random.sample('abc',1)[0] for _ in range(1000)]

    每个循环 4.32 ms ± 67.3 µs(7 次运行的平均值 ± 标准偏差,每次 100 次循环)

到目前为止,Numpy 是最快的。如果你把''.join零件放在那里,你实际上会看到麻木和random.choices脖子和脖子,在这个例子中,两者都比第二快的快三倍。