Numpy:2D配列からランダムな行セットを取得します


159

次のような非常に大きな2D配列があります。

a=
[[a1, b1, c1],
 [a2, b2, c2],
 ...,
 [an, bn, cn]]

numpyを使用して、たとえば初期配列から2つのランダムな行を含む新しい2D配列を取得する簡単な方法はありaますか(置換なし)?

例えば

b=
[[a4,  b4,  c4],
 [a99, b99, c99]]

8
交換用の質問とそうでない質問があるのはばかげています。両方の回答を許可し、実際に両方の回答を奨励する必要があります。
ピノキオ2016年

回答:


193
>>> A = np.random.randint(5, size=(10,3))
>>> A
array([[1, 3, 0],
       [3, 2, 0],
       [0, 2, 1],
       [1, 1, 4],
       [3, 2, 2],
       [0, 1, 0],
       [1, 3, 1],
       [0, 4, 1],
       [2, 4, 2],
       [3, 3, 1]])
>>> idx = np.random.randint(10, size=2)
>>> idx
array([7, 6])
>>> A[idx,:]
array([[0, 4, 1],
       [1, 3, 1]])

一般的な場合のためにまとめます:

A[np.random.randint(A.shape[0], size=2), :]

非置換の場合(numpy 1.7.0以降):

A[np.random.choice(A.shape[0], 2, replace=False), :]

1.7より前の置換なしでランダムリストを生成する良い方法があるとは思いません。おそらく、2つの値が同じにならないように小さな定義をセットアップできます。


4
良い方法はないかもしれませんが、と同じくらい良い方法があります。つまり、実際には素晴らしい方法ではありませんnp.random.choicenp.random.permutation(A.shape[0])[:2]np.random.choice現時点ではそうです...または配列を変更する必要がない場合場所、np.random.shuffle
セベルグ

1
numpy 1.7より前のバージョンでは、random .sample(xrange(10)、2)を使用します
denis

3
なぜ変数AとBなどに名前を付けているのですか?読みにくくなります。
ピノキオ2016年

48

これは古い投稿ですが、これが私にとって最も効果的です:

A[np.random.choice(A.shape[0], num_rows_2_sample, replace=False)]

同じものを取得するには、replace = FalseをTrueに変更しますが、置換を行います。


2
@SalvadorDali置換で選択しないようにHeziの投稿を編集しました。編集がピアレビューされると、に追加されたreplace=Falseパラメーターが表示されchoiceます。
0x24a537r9

8
@ 0x24a537r9これを行うべきではありません。これが彼の答えであり、あなたはそれを変更します。必要に応じて-回答を追加し、回答を大幅に変更する他の人の回答を変更しないでください
Salvador Dali

@SalvadorDaliどうして?
スコット

25

別のオプションは、特定の係数でデータをダウンサンプリングするだけの場合にランダムマスクを作成することです。たとえば、現在配列に保持されている元のデータセットの25%にダウンサンプリングしたいとしますdata_arr

# generate random boolean mask the length of data
# use p 0.75 for False and 0.25 for True
mask = numpy.random.choice([False, True], len(data_arr), p=[0.75, 0.25])

これでdata_arr[mask]、ランダムにサンプリングされた行の〜25%を呼び出して返すことができます。


10

これはHezi Rasheffが提供したものと同様の回答ですが、新しいPythonユーザーが何が起こっているのかを理解できるように簡略化されています(Pythonで何をしているのかわからないため、多くの新しいデータサイエンスの学生が奇妙な方法でランダムサンプルをフェッチしていることに気付きました)。

以下を使用して、配列からランダムなインデックスの数を取得できます。

indices = np.random.choice(A.shape[0], amount_of_samples, replace=False)

次に、numpy配列でスライスを使用して、これらのインデックスでサンプルを取得できます。

A[indices]

これにより、データから指定した数のランダムサンプルが得られます。


5

同じ行が必要でランダムなサンプルだけが必要な場合は、

import random
new_array = random.sample(old_array,x)

ここでxは、ランダムに選択する行数を定義する「int」である必要があります。


3
これold_arrayは、配列またはセットである場合にのみ機能し、 派手な配列ではありません[リンク](docs.python.org/3/library/random.html#functions-for-sequences
leermeester

5

順列が提案されているようです。実際には、1行にすることができます。

>>> A = np.random.randint(5, size=(10,3))
>>> np.random.permutation(A)[:2]

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

2

行のランダムなサブセットを複数生成したい場合、たとえばRANSACを実行している場合。

num_pop = 10
num_samples = 2
pop_in_sample = 3
rows_to_sample = np.random.random([num_pop, 5])
random_numbers = np.random.random([num_samples, num_pop])
samples = np.argsort(random_numbers, axis=1)[:, :pop_in_sample]
# will be shape [num_samples, pop_in_sample, 5]
row_subsets = rows_to_sample[samples, :]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.