web-dev-qa-db-fra.com

Numpy: Obtenir un ensemble aléatoire de lignes d'un tableau 2D

J'ai un très grand tableau 2D qui ressemble à ceci:

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

Avec numpy, existe-t-il un moyen simple d’obtenir un nouveau tableau 2D avec, par exemple, 2 lignes aléatoires du tableau initial a (sans remplacement)?

par exemple.

b=
[[a4,  b4,  c4],
 [a99, b99, c99]]
127
gha
>>> 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]])

Assembler le tout pour un cas général:

A[np.random.randint(A.shape[0], size=2), :]

Pour non remplacement (numpy 1.7.0+):

A[np.random.choice(A.shape[0], 2, replace=False), :]

Je ne crois pas qu'il existe un bon moyen de générer une liste aléatoire sans remplacement avant le 1.7. Vous pouvez peut-être définir une petite définition qui garantisse que les deux valeurs ne sont pas identiques.

156
Daniel

Ceci est un ancien post, mais voici ce qui fonctionne le mieux pour moi:

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

changez le remplacement = False en True pour obtenir la même chose, mais avec remplacement.

41
Hezi Resheff

Une autre option consiste à créer un masque aléatoire si vous souhaitez simplement sous-échantillonner vos données d'un facteur donné. Supposons que je veuille ré-échantillonner à 25% de mon ensemble de données d'origine, qui se trouve actuellement dans le tableau 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])

Vous pouvez maintenant appeler data_arr[mask] et renvoyer environ 25% des lignes, échantillonnées de manière aléatoire.

23
isosceleswheel

C’est une réponse similaire à celle fournie par Hezi Rasheff, mais simplifiée pour que les utilisateurs python les plus récents comprennent ce qui se passe (j’ai remarqué que de nombreux nouveaux étudiants de datascience récupéraient des échantillons aléatoires de la façon la plus étrange car ils ne savaient pas ce qu’ils faisaient. en python).

Vous pouvez obtenir un certain nombre d'indices aléatoires de votre tableau en utilisant:

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

Vous pouvez ensuite utiliser slicing avec votre tableau numpy pour obtenir les échantillons à ces index:

A[indices]

Cela vous donnera le nombre spécifié d'échantillons aléatoires de vos données.

6
CB Madsen

Si vous avez besoin des mêmes lignes mais juste d'un échantillon aléatoire,

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

Ici, x doit être un 'int' définissant le nombre de lignes que vous voulez choisir au hasard.

5
Ankit Agrawal

Je vois que la permutation a été suggérée. En fait, cela peut être transformé en une seule ligne:

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

array([[0, 3, 0],
       [3, 1, 2]])
4
orli

Si vous souhaitez générer plusieurs sous-ensembles de lignes aléatoires, par exemple si vous exécutez RANSAC.

num_pop = 10
num_samples = 2
pop_in_sample = 3
rows_to_sample = np.random.random([num_pop, 5])
random_numbers = np.random.random([num_samples, num_pop])
samples = np.argsort(random_numbers, axis=1)[:, :pop_in_sample]
# will be shape [num_samples, pop_in_sample, 5]
row_subsets = rows_to_sample[samples, :]
1
Ben