出现基本问题是因为random.shuffle使用如下(代码可以找到here)-
x[i], x[j] = x[j], x[i]
如果你对 Numpy 数组进行这种赋值(就像你的情况一样),你就会遇到问题 -
In [41]: ll
Out[41]:
array([[7, 8],
[5, 6],
[1, 2],
[3, 4]])
In [42]: ll[0] , ll[1] = ll[1] , ll[0]
In [43]: ll
Out[43]:
array([[5, 6],
[5, 6],
[1, 2],
[3, 4]])
下面的例子或许能说明问题发生的原因——
In [63]: ll = np.array([[1,2],[3,4],[5,6],[7,8]])
In [64]: ll[0]
Out[64]: array([1, 2])
In [65]: x = ll[0]
In [66]: x
Out[66]: array([1, 2])
In [67]: y = ll[1]
In [68]: y
Out[68]: array([3, 4])
In [69]: ll[1] = x
In [70]: y
Out[70]: array([1, 2])
正如您所看到的,当您将 ll[1] 设置为新值时,y 变量也反映了更改,这很可能是因为 numpy 可能正在原地变异 ll[1](请注意,我不是在谈论ll , ll[1] 内部 ndarray 的 ll )而不是将 x 引用的对象分配给 ll[1] (就像它发生在列表的情况下)。
作为一种解决方案,您可以使用np.random.shuffle() 而不是random.shuffle() -
In [71]: ll = np.array([[1,2],[3,4],[5,6],[7,8]])
In [72]: ll
Out[72]:
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
In [73]: from numpy.random import shuffle
In [74]: shuffle(ll)
In [75]: ll
Out[75]:
array([[7, 8],
[3, 4],
[1, 2],
[5, 6]])
请注意,np.random.shuffle() 仅沿多维数组的第一个索引随机排列元素。 (虽然如果random.shuffle() 有效,它也会这样工作)。