2014-03-15 3 views
9

У меня есть массив с двумя номерами, который я бы хотел перетасовать. Это лучший способ изменить его на 1-й, перетасовать и снова изменить на 2-й или можно перетасовать без изменения формы?Shuffle a numpy array

только с помощью random.shuffle не дает ожидаемых результатов и numpy.random.shuffle перемешивает только строки:

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]] 

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

[[6 7 8] 
[3 4 5] 
[0 1 2]] 

ответ

13

Вы можете сказать np.random.shuffle действовать на выровненной версии:

>>> 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]]) 
7

Вы можете перетасовать a.flat:

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

I т hink это очень импортный t для примечания.
Вы можете использовать random.shuffle(a) , если a - это 1-D массив numpy. Если это N-D (где N> 2), чем

random.shuffle (а)

испортит ваши данные и вернуть некоторые случайные вещи. Как вы можете увидеть здесь:

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]] 

Это известная bug (или фича?) Из NumPy.

Так, толькоnumpy.random.shuffle(a) для Numpy массивовиспользование.