在numpy.array上使用random.shuffle时出现奇怪的行为

时间:2015-09-18 04:25:21

标签: python numpy

import numpy as np
from random import shuffle

a = np.array([[1,2,3],[4,5,6]])
print(a)
for i in range(1000):
    shuffle(a)
print(a)

输出:

[[1 2 3]
 [4 5 6]]
[[1 2 3]
 [1 2 3]]

获得两个[1, 2, 3][4, 5, 6]缺失。

import numpy as np
from random import shuffle

a = np.arange(10).reshape(5,2)
print(a)
for i in range(1000):
    shuffle(a)
print(a)

输出:

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

数组中的所有项目都成为第一项。

2 个答案:

答案 0 :(得分:3)

numpy.random.shuffle(a)应该做你想要的。在终端上使用random.shuffle,它似乎不能很好地处理矩阵。

Shuffle a numpy array

答案 1 :(得分:3)

出现基本问题是因为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]位置变异(请注意) ,我不是在谈论llll[1] ndarray的{​​{1}}},而不是将ll引用的对象分配给x(喜欢在列表的情况下发生。)

作为解决方案,您可以使用np.random.shuffle()代替ll[1] -

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()起作用,它也会起作用。)