If your array is multi-dimensional, np.random.permutation by default moves along the first axis (columns):
>>> np.random.permutation(arr) array([[ 4, 5, 6, 7], [ 8, 9, 10, 11], [ 0, 1, 2, 3], [12, 13, 14, 15]])
However, this shuffles the row indices, so each column has the same (random) ordering.
The easiest way to shuffle each column independently can be to loop through the columns and use np.random.shuffle to shuffle each one in place:
for i in range(arr.shape[1]): np.random.shuffle(arr[:,i])
Which gives, for example:
array([[12, 1, 14, 11], [ 4, 9, 10, 7], [ 8, 5, 6, 15], [ 0, 13, 2, 3]])
This method can be useful if you have a very large array that you do not want to copy because the permutation of each column is done in place. On the other hand, even simple Python loops can be very slow, and there are faster NumPy methods, such as those provided by @jme.