2016-08-04 26 views
1

私は例えば、可能な値の範囲を持っている:Python:できるだけ均等に分布するリストのサブセット?

possible_values = range(100) 

私は、たとえば、その範囲内の非体系的(しかしユニーク)番号のリストを持っている:

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

私が作成したいですこれらの値のサブセットを含むが、可能な値の範囲にわたって可能な限り均等に分布された長さ< len(移動体)の新しいリスト。

[33, 77] 

などの後、理想的には出力何かがだから私はどちらもランダムなサンプルも等間隔の整数から選ばれたサンプルを望む

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

:たとえば。私は可能な値の間隔に関して分布(ここでは一様分布)に基づいてサンプルを持っていたいと思います。 これを実現する機能や簡単な方法はありますか?

+0

値またはリストの場所に基づいて配布されていますか? –

+0

可能な値の範囲を意味します。可能な値が0から100までですが、リストが歪んだ場合、たとえば[0,5,10,15,20,33,77,99]と2つの値を選択する必要がある場合は、[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

それは基本的に私が意味していたものです。しかし、2つの注意点(私にとってはとにかく...):上記のコードは反復値を返すので(選択された項目はsomelistから削除する必要があります)、最も近い値が範囲を超えていると範囲を超えます。 –

-2

random.sample(population, k)の機能を確認してください。それはk長さのリストの人口をサンプリングします。

+0

これは非常に具体的なサンプルを求める質問とはほとんど関係がありません。 –

+0

これはランダムな値だけを選択するようです。私は一様分布に基づいて非ランダムな選択が必要です。 –

+0

ディストリビューションに基づいてランダムに選択することはできますか? – Gogetek

1

範囲が0..N-1で、K < = N-1の値のリストが必要であるとします。次に、K値の「理想的な」リストを定義します。このリストは、この完全なリスト(私は、それが何であるか分かりませんが、うまくいけばあなたがしていることを確信していません)最後に、ランダムに選択したK以上の長さのサブリストの値に最も近いものを取り、適切に分散したK長のランダムサブリストを取得します。

関連する問題