随机抽样与假设检验

4
在 Hypothesis 中,有一个对应的 sampled_from() 策略可以替代 random.choice()
In [1]: from hypothesis import find, strategies as st

In [2]: find(st.sampled_from(('ST', 'LT', 'TG', 'CT')), lambda x: True)
Out[2]: 'ST'

但是,是否有一种类似于 random.sample() 的策略可以从一个序列中产生长度为 N 的子序列?

In [3]: import random

In [4]: random.sample(('ST', 'LT', 'TG', 'CT'), 2)
Out[4]: ['CT', 'TG']
2个回答

2
你可以这样做:
permutations(elements).map(lambda x: x[:n])

1

感觉使用 lists 策略应该是可行的,但我无法使其工作。通过模仿 sampled_from 代码,我成功创建了一个似乎可以正常工作的东西。

from random import sample
from hypothesis.searchstrategy.strategies import SearchStrategy
from hypothesis.strategies import defines_strategy


class SampleMultipleFromStrategy(SearchStrategy):
    def __init__(self, elements, n):
        super(SampleMultipleFromStrategy, self).__init__()
        self.elements = tuple(elements)
        if not self.elements:
            raise ValueError
        self.n = int(n)

    def do_draw(self, data):
        return sample(self.elements, self.n)

@defines_strategy
def sample_multiple_from(elements, n):
    return SampleMultipleFromStrategy(elements, n)

样例结果:
>>> find(sample_multiple_from([1, 2, 3, 4], 2), lambda x: True)
[4, 2]

2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - DRMacIver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接