打乱numpy数组
我有一个二维的numpy数组,我想把它打乱。最好的方法是先把它变成一维的,打乱后再变回二维,还是说可以直接打乱而不需要变形呢?
直接使用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]]
3 个回答
7
我觉得这点非常重要,值得注意。
如果你有一个一维的numpy数组,可以使用 random.shuffle(a)
来打乱它的顺序。
但是如果你的数组是多维的(也就是维度大于2),那么
random.shuffle(a)
就会搞坏你的数据,返回一些随机的东西。
你可以在这里看到这个问题:
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]]
这是numpy的一个已知的bug(或者说是一个特性?)。
所以,只使用 numpy.random.shuffle(a)
来处理numpy数组。
8
你可以对 a.flat
进行随机排序:
>>> np.random.shuffle(a.flat)
>>> a
array([[6, 1, 2],
[3, 5, 0],
[7, 8, 4]])
20
你可以让 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]])