2011-01-31 6 views
5

私はrange(n)からの数字のすべての可能な組の中から、交換せずに、サンプルを必要としています。つまり、(0,0)、(0,1)、...、(0、n)、(1,0)、(1,1)、...、(1、n)のコレクションを持っています。 )、...、(n、0)、(n、1)、(n、n)、これらの要素のkサンプルを取得しようとしています。私は明示的にこのコレクションを構築することを避けることを望んでいます。のpython:2Dグリッドから交換せずにサンプリング

私は数字ではなく、数字のタプルのシーケンスからサンプルを必要に応じてrandom.sample(range(n), k)はシンプルかつ効率的であることを知っています。

もちろん、可能なすべての(n * n = n^2)タプルを含むリストを明示的に作成してから、random.sampleを呼び出すことができます。しかし、kn^2よりずっと小さい場合、おそらく効率的ではありません。

Python 2と3の効率が同じであるかどうかはわかりません。私はPython 3を使用しています。

+2

タプルは、配列であります意味がありません。一連のタプルからサンプルを取得する必要があるということですか?その場合、これらのタプルがどのように見えるかは不明です。 –

+0

あなたのコード( 'random.sample(レンジ(N)、k)は'作品とすべてのシーケンス、タプル、リスト、文字列や 'collections.Sequence'の任意のサブクラスのために正しいです。あなたはまだあなたのコードを試してみましたか?質問は何? –

+0

@Regebro: 'タプル'からのサンプル= 'nタプルのシーケンスからkタプルのサンプル'。 'シーケンスからのサンプル' = 'n個の要素のシーケンスからk個の要素のサンプル'。私は明確にするために質問を編集するつもりです。私は、シーケンス((0,0)、(0,1)、(0,2)、(1,0)、(1,1)を参照できないということを意味しています。 、(1,2)、(2,0)、(2,1)、(2,2))を簡単に ''サンプル 'を適用できる単純な ''範囲' – max

答えて

6

これらのどれくらいのものを選んでいるのかによって、あなたが何を選んだのかを把握してから(setを介して)あなたがまだ選んでいないこと。 (手元に何のpython)をしようとしませんがなければ

numbers_in_nxn = random.sample(range(n*n), k) # Use xrange in Python 2.x 
tuples_in_nxn = [divmod(x,n) for x in numbers_in_nxn] 
+0

私はあなたがこの部分を入れていることに気付いたときに、それが私が書いていたものだから 'random.sample(range(n * n)、k)'を意味すると思います。 –

+0

+1 2番目のオプションは私にとって完璧です'n * n 'を' range(n * n)'、 '100'を' n 'で置き換えたもの) 「サンプル」が非常に効率的であると主張されているので、セットからの描画がより良くなるとは思えません。 – max

+1

'(x%n、x // n)'を 'divmod(x、n)'に置き換えることができます。 – Kabie

0

他の選択肢はいくつかの簡単な数学を使用することです

random.shuffle(range(n))[:k] 

はコメントを参照してください。あなたが言う...十分

+0

これは 'n' x' n'にタプルを与えません。なぜなら、 '(1,1)'とは言わないからです。 – Amber

+0

しかし、「置き換えなし」とはどういう意味ですか?ああ、今私は見る。長さnのk個の異なるタプル。 – Howard

0

眠れませんでした。もちろん

を、私は明示的にすべての可能性(N * N = N^2)のタプルを含む リストを作成し、その後 を呼び出すことができますrandom.sample。しかし、kがはるかに小さい場合は、おそらく は効率的ではありません。 はn^2より小さくなります。

のタフルの作成については、をランダムに選択してください。つまり、ランダムに選択する前にタプルを作成することができれば、まずピッキングを行い、後でビルドを行うことができます。

の代わりにこれをやって:

私はあなたのタプルは同じ長さのすべてされている実感が、私は、あなたのタプルを見ることになったが、ここでは一例ですされているかを理解していないが、これは原理を示す

あなたはこれを行うだろう
>>> import random 
>>> all_sequences = [range(x) for x in range(10)] 
>>> all_sequences 
[[], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7, 8]] 
>>> random.sample(all_sequences, 3) 
[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5, 6, 7, 8]] 

:あなたの文章は、「数字ではなく、数字のタプルのシーケンスからサンプルを必要としていました。」よう

>>> import random 
>>> selection = random.sample(range(10), 3) 
>>> [range(x) for a in selection] 
[[0, 1, 2, 3, 4, 5, 6, 7, 8], [0, 1, 2, 3, 4, 5, 6, 7, 8], [0, 1, 2, 3, 4, 5, 6, 7, 8]] 
関連する問題