Comment sélectionner aléatoirement les lignes d'un tableau de données sous python avec numpy ?

Active 11 juillet 2014    /    Viewed 4196    /    Comments 0    /    Edit


Exemple de comment sélectionner aléatoirement les lignes d'un tableau de données sous python avec numpy

Tableau de données

Soit le tableau de données suivant:

    >>> import numpy as np
>>> 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}

Utiliser la fonction shuffle

Pour sélectionner aléatoirement des lignes du tableau une solution est d'utiliser shuffle()

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

puis sélectionner les n (pare exemple n=4) premières lignes:

>>> data = data[:4,:]
>>> data
array([[50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
       [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
       [60, 61, 62, 63, 64, 65, 66, 67, 68, 69]])

Exemple avec 4 lignes sélectionnées aléatoirement

\begin{equation}
data = \left( \begin{array}{ccc}
50 & 51 & 52 & 53 & 54 & 55 & 56 & 57 & 58 & 59 \\
0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 \\
40 & 41 & 42 & 43 & 44 & 45 & 46 & 47 & 48 & 49 \\
60 & 61 & 62 & 63 & 64 & 65 & 66 & 67 & 68 & 69
\end{array}\right)
\end{equation}

Note: pour supprimer des lignes ou une condition est vérifiée (voir):

>>> data = data[~(data[:,3] > 50)]
>>> data
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [40, 41, 42, 43, 44, 45, 46, 47, 48, 49]])

Liste d'entiers aléatoires

Autre option générer une liste d'entiers aléatoires

>>> 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]])
>>> import random
>>> rows_id = random.sample(range(0,data.shape[1]-1), 4)
>>> rows_id
[4, 6, 2, 3]
>>> data = data[rows_id,:]
>>> data
array([[40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
       [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]])

Références

Liens Site
numpy.random.shuffle Scipy Doc
Create numpy array with random elements from list stackoverflow
randomly selecting items from an array python stackoverflow
Select cells randomly from NumPy array - without replacement stackoverflow
How to truncate matrix using NumPy (Python) stackoverflow
How to truncate the values of a 2D numpy array stackoverflow
numpy.delete stackoverflow
Python delete row in numpy array stackoverflow


Card image cap
profile-image
Daidalos

Hi, I am Ben.

I have developed this web site from scratch with Django to share with everyone my notes. If you have any ideas or suggestions to improve the site, let me know ! (you can contact me using the form in the welcome page). Thanks!