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 ()?
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)
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.