web-dev-qa-db-ja.com

numpy.random.choiceとrandom.choice

Numpy.random.choiceがrandom.choiceと同じように機能しないのはなぜですか?私がこれをするとき:

 >>> random.choice([(1,2),(4,3)])
 (1, 2)

できます。

しかし、私がこれをするとき:

 >>> np.random.choice([(1,2), (3,4)])
 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "mtrand.pyx", line 1393, in mtrand.RandomState.choice 
 (numpy/random/mtrand/mtrand.c:15450)
 ValueError: a must be 1-dimensional

Numpy.random.choice()でrandom.choice()と同じ動作を実現するにはどうすればよいですか?

6
user2399453

まあ np.random.choice ドキュメントに記載されているように、1D配列を想定しており、配列として表現した場合の入力は2Dになります。したがって、それは単純にそのように機能しません。

それを機能させるために、入力の長さをフィードし、1つのインデックスを選択させることができます。これは、入力にインデックスされたときに、次に示すようにrandom.choiceからの同等のインデックスになります-

out = a[np.random.choice(len(a))] # a is input

サンプルの実行-

In [74]: a = [(1,2),(4,3),(6,9)]

In [75]: a[np.random.choice(len(a))]
Out[75]: (6, 9)

In [76]: a[np.random.choice(len(a))]
Out[76]: (1, 2)

または、入力をオブジェクトdtypeの1D配列に変換することもできます。これにより、次に示すように、np.random.choiceを直接使用できます-

In [131]: a0 = np.empty(len(a),dtype=object)

In [132]: a0[:] = a

In [133]: a0.shape
Out[133]: (3,)  # 1D array

In [134]: np.random.choice(a0)
Out[134]: (6, 9)

In [135]: np.random.choice(a0)
Out[135]: (4, 3)
15
Divakar

関連して、ランダムにサンプリングしたい場合rowsこのような2D行列の

x = np.array([[1, 100], [2, 200], [3, 300], [4, 400]])

それからあなたはこのようなことをすることができます:

n_rows = x.shape[0]
x[np.random.choice(n_rows, size=n_rows, replace=True), :]

任意の数の列を持つ2Dマトリックスで機能するはずです。もちろん、size kwargなどで何度でもサンプリングできます。

3
Ben Vincent