Shuffle a numpy array

I think this is very important to note.
You can use random.shuffle(a) if a is 1-D numpy array. If it is N-D (where N > 2) than

random.shuffle(a)

will spoil your data and return some random thing. As you can see here:

import random
import numpy as np
a=np.arange(9).reshape((3,3))
random.shuffle(a)
print a

[[0 1 2]
 [3 4 5]
 [3 4 5]]

This is a known bug (or feature?) of numpy.

So, use only numpy.random.shuffle(a) for numpy arrays.


You could shuffle a.flat:

>>> np.random.shuffle(a.flat)
>>> a
array([[6, 1, 2],
       [3, 5, 0],
       [7, 8, 4]])

You can tell np.random.shuffle to act on the flattened version:

>>> a = np.arange(9).reshape((3,3))
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> np.random.shuffle(a.flat)
>>> a
array([[3, 5, 8],
       [7, 6, 2],
       [1, 4, 0]])