2016-10-12 1 views
2

置き換えなし指定された分布に従ってサンプルからn個の要素を選択します。Numpyは特定の次元に沿って置換えなしで選択する

反復解決策は単純です:

for _ in range(n): 
    np.random.choice(a, size=k, replace=False, p=p) 

私はサンプル間で交換することなく、サンプルになるので、私はsize=(k, n)を設定することはできません。 anが大きければ、私はベクトル化された解を期待しています。

+0

私は本当に –

+0

は 'np.random.choice(np.arange考えてみましょう疑問を理解していません(5)、size =(3、5)、replace = False) 'である。これは、 'Replace = Falseのときに母集団より大きなサンプルを取ることはできません'というエラーを出します。私が望むのは、置き換えなくても、それぞれ5回、 'range(5) 'から3つの値を選ぶことです。 –

+0

あなたはエラーを与えるコードで編集できますか? –

答えて

0

だから、完全な反復解は次のようになります。

In [158]: ll=[] 
In [159]: for _ in range(10): 
    ...:  ll.append(np.random.choice(5,3)) 
In [160]: ll 
Out[160]: 
[array([3, 2, 4]), 
array([1, 1, 3]), 
array([0, 3, 1]), 
... 
array([0, 3, 0])] 
In [161]: np.array(ll) 
Out[161]: 
array([[3, 2, 4], 
     [1, 1, 3], 
     ... 
     [3, 0, 1], 
     [4, 4, 2], 
     [0, 3, 0]]) 
リストの内包としてキャストすることができ

np.array([np.random.choice(5,3) for _ in range(10)])

言い換えれば、あなたA=np.zeros((10,3),int)A[i,:]=np.random...

同等あなたはrange(5)から選択をしたいが、彼らは唯一の行内で一意になりたいです。私は、行の中に

array([[0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4], 
     ... 
     [0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4]]) 

と並び替える値を生成することができる場合、私は思ったんだけど

>>> np.random.choice(5, 3, replace=False) 
array([3,1,0]) 
>>> #This is equivalent to np.random.permutation(np.arange(5))[:3] 

np.random.choiceドキュメント

は代替案を提案します。しかし、 permuteでは、すべての列をシャッフルすることしかできません。だから、私はまだ行を反復することで、置換えなしで選択肢を作り出すことができません。

0

ここにいくつかの提案があります。

  1. あなたは(n, k)出力配列を事前に割り当てることができ、その後の選択肢を複数回実行します。

    result = np.zeros((n, k), dtype=a.dtype) 
    for row in range(n): 
        result[row, :] = np.random.choice(a, size=k, replace=False, p=p) 
    
  2. あなたはn * k選択インデックスを事前に計算して、すべてを一度にaに適用することができます。あなたは再びループでnp.choiceを使用したいと思うでしょう、交換せずにインデックスをサンプリングしたいので:

    indices = np.concatenate([np.random.choice(a.size, size=k, replace=False, p=p) for _ in range(n)]) 
    result = a[indices].reshape(n, k) 
    
関連する問題