2016-08-04 33 views
1

我有一个可能值的范围,例如:Python:列表尽可能平均分布的子集?

possible_values = range(100) 

我与该范围内的非系统性(但唯一)号的列表,例如:

somelist = [0, 5, 10, 15, 20, 33, 77, 99] 

我想创建一个包含这些值的子集但长度尽可能均匀分布在可能值范围内的新列表(长度为< len(somelist))。例如:

length_newlist = 2 
newlist = some_function(somelist, length_newlist, possible_values) 
print(newlist) 

,然后这些理想的输出类似

[33, 77] 

所以我既不想进行随机抽样,也避免了等间隔的整数选择一个样本。我想根据一个分布(这里是一个统一的分布)对可能值的区间进行抽样。 有没有一个功能或简单的方法来实现这一点?

+0

根据价值或在列表中的位置分发? –

+0

我的意思是关于可能值的范围。如果可能的值是从0到100,但列表是倾斜的,例如[0,5,10,15,20,33,77,99],我应该选择两个值,这将是[33,77],而不是[10,33](将在指数中平均分配)。我用这个例子编辑了我的答案,希望更清楚我的意思。 –

回答

1

你子集的最接近的值与特定列表的关键点有什么关系?即:

def some_function(somelist, length_list, possible_values): 
    a = min(possible_values) 
    b = max(possible_values) 
    chunk_size = (b-a)/(length_list+1) 

    new_list = [] 
    for i in range(1,length_list+1): 
     index = a+i*chunk_size 
     new_list.append(min(somelist, key=lambda x:abs(x-index))) 

    return new_list 

possible_values = range(100) 
somelist = [0, 5, 10, 15, 20, 33, 77, 99] 
length_newlist = 2 
newlist = some_function(somelist, length_newlist, possible_values) 

print(newlist) 

在任何情况下,我也建议你看看到numpy's random sampling功能,可以帮助您。

+0

这基本上就是我的意思。两个警告虽然(对我来说......):上面的代码返回重复的值(所以选择的项目必须从somelist中删除),如果最接近的值高于范围,则超出范围。 –

-2

我想你应该检查random.sample(population, k)函数。它以k长度列表对样本进行采样。

+0

这与问一个非常具体的样本的问题没有多大关系。 –

+0

这似乎只选择随机值。我需要一个基于均匀分布的非随机选择。 –

+0

如何根据分布选择非随机数? – Gogetek

1

假设您的范围是0..N-1,并且您想要K < = N-1值的列表。然后定义一个K值的“理想”列表,这将是您在这个完整列表中的理想分布(我坦率地不确定我理解那将是什么,但希望您能做到)。最后,从您随机选择的大于K长度的子列表中选择最接近的匹配值,以获得您的正确分布的K长度随机子列表。