Python数据等比连续抽样算法

numpy里面自带了几种抽样算法,但都是随机抽样,我这里要做的是等比连续抽样,就是对原始数据从前到后按固定的间隔固定的顺序去抽样数据。
方法一:
把列表分成n个子组,从每个子组中再抽取一个数作为样本

def evenly_divide_list(lst, num_groups):
    """按顺序分隔列表为指定数量的子组
    Args:
        lst (list): 列表
        num_groups (int): 分隔次数
    Returns:
        list: 返回子列表的集合
    """
    quotient, remainder = divmod(len(lst), num_groups)
    group_sizes = [quotient] * num_groups
    for i in range(remainder):
        group_sizes[i] += 1
    groups = []
    i = 0
    for size in group_sizes:
        groups.append(lst[i:i + size])
        i += size
    return groups
data = [1, 2, 4, 5]
count = 3
sample_group = evenly_divide_list(data, count)
for i in range(len(sample_group)):
        print(sample_group[i][0])

方法二:
对列表索引分成固定的间隔然后进行进行四舍五入

def extract_elements(lst, num_elements):
    """按顺序均匀抽样元素
    Args:
        lst (list): 列表
        num_groups (int): 抽样次数
    Returns:
        list: 返回抽样元素的集合
    """
    if num_elements > len(lst):
        return lst
    step = len(lst) / num_elements
    return [lst[round(i * step)] for i in range(num_elements)]
data = [1, 2, 4, 5]
count = 3
sample_group = extract_elements(data, count)
for i in range(len(sample_group)):
        print(sample_group[i])

第一种方法是把不能整分的元素全部加到最前面几个组中,这样前面的组就比后面的组抽样间隔更大
第二种方法则是把不能等分的元素按四舍五入法分散在不同的段中,这种方法显然抽样更均匀,而且方法一多了一个数组切分过程,算法复杂度更大,所以推荐用方法二。

发表回复