打乱numpy数组

17 投票
3 回答
17505 浏览
提问于 2025-04-17 22:27

我有一个二维的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]])

撰写回答