2016-08-04 50 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長度隨機子列表。