web-dev-qa-db-fra.com

numpy.random.choice vs random.choice

Pourquoi numpy.random.choice ne fonctionne-t-il pas de la même manière que random.choice? Quand je fais ça:

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

Ça marche.

Mais quand je fais ça:

 >>> 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

Comment obtenir le même comportement que random.choice () dans numpy.random.choice ()?

5
user3079275

Eh bien np.random.choice comme indiqué dans la documentation, attend un tableau 1D et votre entrée exprimée sous forme de tableau serait 2D. Donc, ça ne marchera pas simplement comme ça.

Pour que cela fonctionne, nous pouvons indiquer la longueur de l'entrée et lui laisser sélectionner un index qui, une fois indexé dans l'entrée, serait l'équivalent de random.choice, comme indiqué ci-dessous -

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

Exemple de cycle -

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)

Alternativement, nous pouvons convertir l’entrée en un tableau 1D d’objets dtype, ce qui nous permettrait d’utiliser directement np.random.choice, comme indiqué ci-dessous -

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)
14
Divakar

De même, si vous souhaitez échantillonner au hasard rangées d’une matrice 2D comme celle-ci

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

alors vous pouvez faire quelque chose comme ça:

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

Devrait fonctionner pour une matrice 2D avec un nombre quelconque de colonnes, et vous pouvez évidemment échantillonner autant de fois que vous le souhaitez avec le size kwarg, etc.

2
Ben Vincent