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]]
数组中的所有项目都成为第一项。
答案 0 :(得分:3)
numpy.random.shuffle(a)应该做你想要的。在终端上使用random.shuffle,它似乎不能很好地处理矩阵。
答案 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]
位置变异(请注意) ,我不是在谈论ll
,ll[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()
起作用,它也会起作用。)