202

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

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

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

例えば

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

9 に答える 9

256
>>> 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 つの値が同じではないことを保証する小さな定義をセットアップできます。

于 2013-01-10T16:35:09.710 に答える
32

別のオプションは、特定の係数でデータをダウンサンプリングするだけの場合は、ランダム マスクを作成することです。現在配列に保持されている元のデータセットの 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% の行を呼び出して返すことができます。

于 2015-08-03T18:58:14.287 に答える
24

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

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

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

次に、派手なインデックス付けを numpy 配列で使用して、それらのインデックスでサンプルを取得できます。

A[indices]

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

于 2018-12-20T10:35:34.440 に答える
5

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

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

array([[0, 3, 0],
       [3, 1, 2]])
于 2018-10-19T21:35:49.887 に答える
1

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

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

ここで x は、ランダムに選択する行数を定義する「int」でなければなりません。

于 2017-05-16T22:55:10.400 に答える