26 votes

Comment obtenir l'index de numpy.random.choice ? - python

Est-ce qu'il est possible de modifier la fonction numpy.random.choice pour qu'elle retourne l'index de l'élément choisi ? En fait, je veux créer une liste et sélectionner des éléments au hasard sans remplacement

import numpy as np
>>> a = [1,4,1,3,3,2,1,4]
>>> np.random.choice(a)
>>> 4
>>> a
>>> [1,4,1,3,3,2,1,4]

a.remove(np.random.choice(a)) supprimera le premier élément de la liste avec la valeur qu'il rencontre ( a[1] dans l'exemple ci-dessus), qui peut ne pas être l'élément choisi (ex, a[7] ).

15voto

Óscar López Points 97105

Voici un moyen de connaître la index d'un élément choisi au hasard :

import random # plain random module, not numpy's
random.choice(list(enumerate(a)))[0]
=> 4      # just an example, index is 4

Vous pouvez également récupérer l'élément y l'index en une seule étape :

random.choice(list(enumerate(a)))
=> (1, 4) # just an example, index is 1 and element is 4

14voto

CT Zhu Points 12184

En ce qui concerne votre première question, vous pouvez travailler dans l'autre sens, en choisissant au hasard l'index du tableau a puis récupère la valeur.

>>> a = [1,4,1,3,3,2,1,4]
>>> a = np.array(a)
>>> random.choice(arange(a.size))
6
>>> a[6]

Mais si vous avez seulement besoin d'un échantillon aléatoire sans remplacement, replace=False fera l'affaire. Je ne me souviens pas de la date à laquelle il a été ajouté pour la première fois. random.choice Il pourrait s'agir de la version 1.7.0. Donc, si vous utilisez de très vieux numpy il se peut que cela ne fonctionne pas. N'oubliez pas que la valeur par défaut est replace=True

10voto

user2357112 Points 37737
numpy.random.choice(a, size=however_many, replace=False)

Si vous voulez un échantillon sans remplacement, demandez à numpy de vous en fabriquer un. Ne faites pas de boucle et ne dessinez pas d'éléments de façon répétée. Cela produira un code gonflé et des performances horribles.

Exemple :

>>> a = numpy.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> numpy.random.choice(a, size=5, replace=False)
array([7, 5, 8, 6, 2])

Avec un NumPy suffisamment récent (au moins 1.17), vous devriez utiliser la nouvelle API aléatoire, qui corrige un problème de performance de longue date où l'ancienne API replace=False a généré inutilement une permutation complète de l'entrée sous le capot :

rng = numpy.random.default_rng()
result = rng.choice(a, size=however_many, replace=False)

4voto

lmjohns3 Points 1964

C'est un peu à l'écart par rapport aux autres réponses, mais j'ai pensé que cela pourrait aider ce que vous semblez essayer de faire dans un sens un peu plus large. Vous pouvez générer un échantillon aléatoire sans remplacement en mélangeant les indices des éléments du tableau source :

source = np.random.randint(0, 100, size=100) # generate a set to sample from
idx = np.arange(len(source))
np.random.shuffle(idx)
subsample = source[idx[:10]]

Cela permet de créer un échantillon (ici, de taille 10) en tirant des éléments de l'ensemble source (ici, de taille 100) sans remplacement.

Vous pouvez interagir avec les éléments non sélectionnés en utilisant les valeurs d'index restantes, c'est-à-dire :

notsampled = source[idx[10:]]

1voto

Tobias Kienzler Points 3769

Au lieu d'utiliser choice vous pouvez aussi simplement random.shuffle votre tableau, c'est-à-dire

random.shuffle(a)  # will shuffle a in-place

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X