Comment sélectionner aléatoirement les éléments d'une matrice en python avec numpy ?

Daidalos December 03, 2019


Exemples de comment sélectionner aléatoirement les éléments d'une matrice en python avec numpy

Échantillonnage aléatoire avec choice()

Soit une matrice 1D avec 10 éléments:

>>> import numpy as np
>>> data = np.arange(10)
>>> data
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

\begin{equation}
A = \left( \begin{array}{ccc}
0 & 1& 2& 3& 4& 5& 6& 7& 8& 9
\end{array}\right)
\end{equation}

Pour sélectionner aléatoirement n éléments de la matrice on peut utiliser la fonction choice(). Exemple avec n = 4:

>>> np.random.choice(data,4)
array([9, 6, 2, 9])

donne

\begin{equation}
A = \left( \begin{array}{ccc}
9 & 6 & 2 & 9
\end{array}\right)
\end{equation}

Autre exemple avec n = 5

>>> for i in range(10):
...     np.random.choice(data,5)
... 
array([3, 4, 0, 8, 4])
array([3, 0, 0, 3, 6])
array([5, 1, 2, 0, 9])
array([5, 8, 6, 0, 1])
array([4, 0, 9, 4, 2])
array([9, 6, 3, 9, 9])
array([9, 5, 1, 2, 7])
array([9, 7, 6, 4, 5])
array([6, 8, 5, 5, 9])
array([8, 9, 5, 5, 6])

Échantillonnage aléatoire sans remplacement

Pour un échantillonnage aléatoire sans remplacement il faut ajouter l'option "replace = False":

>>> for i in range(10):
...     np.random.choice(data,5,replace=False)
... 
array([9, 7, 4, 0, 6])
array([0, 9, 2, 4, 6])
array([2, 6, 5, 0, 9])
array([0, 3, 5, 7, 9])
array([0, 5, 9, 6, 7])
array([5, 0, 9, 6, 3])
array([7, 2, 6, 9, 1])
array([7, 6, 5, 8, 4])
array([6, 8, 5, 7, 4])
array([0, 1, 2, 3, 5])

Échantillonnage aléatoire pondéré

Pour un échantillonnage aléatoire pondéré, on peut préciser un poids pour chaque élément:

>>> p = [0.05, 0.05, 0.1, 0.125, 0.175, 0.175, 0.125, 0.1, 0.05, 0.05]

Note: la somme des poids doit être égal à 1

>>> sum(p)
1.0

Par exemple ici les éléments 0,1,8,9 on une probabilité plus faible d'être sélectionnées:

>>> for idx,p in enumerate(p):
...     print(p,data[idx])
... 
0.05 0
0.05 1
0.1 2
0.125 3
0.175 4
0.175 5
0.125 6
0.1 7
0.05 8
0.05 9

Test

>>> for i in range(10):
...     np.random.choice(data,5,replace=False,p=p)
... 
array([7, 5, 0, 2, 3])
array([9, 2, 3, 5, 7])
array([2, 5, 3, 7, 4])
array([7, 2, 9, 4, 5])
array([1, 4, 6, 3, 2])
array([4, 5, 3, 7, 1])
array([2, 7, 4, 6, 3])
array([6, 5, 0, 1, 8])
array([4, 0, 5, 9, 6])
array([8, 9, 3, 4, 6])

Échantillonnage aléatoire pondéré pour une matrice 2D

Soit la matrice 2D suivante

>>> data =  np.arange(80).reshape((8, 10))
>>> data
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
       [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
       [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
       [70, 71, 72, 73, 74, 75, 76, 77, 78, 79]])

\begin{equation}
data = \left( \begin{array}{ccc}
0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 \\
10 & 11 & 12 & 13 & 14 & 15 & 16 & 17 & 18 & 19 \\
20 & 21 & 22 & 23 & 24 & 25 & 26 & 27 & 28 & 29 \\
30 & 31 & 32 & 33 & 34 & 35 & 36 & 37 & 38 & 39 \\
40 & 41 & 42 & 43 & 44 & 45 & 46 & 47 & 48 & 49 \\
50 & 51 & 52 & 53 & 54 & 55 & 56 & 57 & 58 & 59 \\
60 & 61 & 62 & 63 & 64 & 65 & 66 & 67 & 68 & 69 \\
70 & 71 & 72 & 73 & 74 & 75 & 76 & 77 & 78 & 79
\end{array}\right)
\end{equation}

La fonction choice() prend comme "input" une matrice 1D, cependant on peut facilement transformer une matrice 2D en 1D avec la fonction ravel(), exemple:

>>> np.random.choice( data.ravel(),10,replace=False)
array([64, 35, 53, 14, 48, 29, 74, 21, 62, 41])

Références

Liens Site
Random sampling in numpy sample() function geeksforgeeks
numpy.random.choice stackoverflow
A weighted version of random.choice stackoverflow
Create sample numpy array with randomly placed NaNs stackoverflow
Normalizing a list of numbers in Python stackoverflow

Licence


Google Ads


Activity


Google Ads