Mélanger aléatoirement les éléments d'une matrice (tableau) avec python et numpy

Active 07 décembre 2016    /    Viewed 4284    /    Comments 0    /    Edit


Pour mélanger aléatoirement les éléments d'une matrice 1D il existe la fonction numpy shuffle, exemple avec la matrice suivante:

\begin{equation}
M =
\left( \begin{array}{cccccc}
4 & 8 & 15 & 16 & 23 & 42
\end{array}\right)
\end{equation}

>>> import numpy as np
>>> M = np.array([4,8,15,16,23,42])
>>> np.random.shuffle(M)
>>> M
array([15, 16,  8, 42, 23,  4])
>>> np.random.shuffle(M)
>>> M
array([ 8, 42, 23, 15, 16,  4])
>>>

Pour une matrice de dimension 2 ou supérieur la fonction numpy shuffle ne va pas mélanger aléatoirement les éléments de la matrice mais uniquement permuter aléatoirement les lignes de la matrice, exemple avec la matrice:

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

>>> import numpy as np
>>> M = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> M
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> np.random.shuffle(M)
>>> M
array([[7, 8, 9],
       [1, 2, 3],
       [4, 5, 6]])
>>> np.random.shuffle(M)
>>> M
array([[4, 5, 6],
       [7, 8, 9],
       [1, 2, 3]])

Pour mélanger aléatoirement les éléments d'une matrice multidimensionnelle il faut donc d'abord la transformer en matrice 1d, mélanger aléatoirement les éléments avec shuffle et redimensionner la matrice:

>>> import numpy as np
>>> M = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> M
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> M = M.ravel()
>>> M
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.random.shuffle(M)
>>> M
array([3, 1, 9, 5, 2, 8, 4, 7, 6])
>>> M = M.reshape(3,3)
>>> M
array([[3, 1, 9],
       [5, 2, 8],
       [4, 7, 6]])

Résultat

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

Recherches associées

Liens Site
numpy.random.shuffle docs.scipy.org
numpy.random.permutation docs.scipy.org
shuffle vs permute numpy stackoverflow
Numpy shuffle multidimensional array by row only, keep column order unchanged 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!