Python中的random.shuffle()函数无法打乱多维数组中的数据

现在我有一个需求,需要打乱一个如下图所示的10*2的二维数组

[[ 0 1]
[ 2 3]
[ 4 5]
[ 6 7]
[ 8 9]
[10 11]
[12 13]
[14 15]
[16 17]
[18 19]]

c = random.randint(1, 1000)
b = np.arange(20).reshape(10, 2)
print(b)
random.seed(c)
random.shuffle(b)
print(b)

发现用random.shuffle()函数打乱二维数组后,得到的打乱后的二维数组如下所示
Python中的random.shuffle()函数无法打乱多维数组中的数据_第1张图片
与我想实现的结果有点差别,我是想让原来的二维数组中的行向量位置随机改变,并不改变原来每个行向量中的数据,原来的行向量不会消失,但是使用这个函数后,有些行向量消失了,并且某些行向量重复出现。
然而当用random.shuffle()打乱一维维向量时,能顺利的实现我们的要求。

a = np.linspace(0.1, 1.0, 5)
a1 = (np.linspace(0.1, 0.2, 5))*10
print('打乱之前的数据:{0},{1}'.format(a, a1))
random.seed(c)
random.shuffle(a)
random.seed(c)  # 按照与打乱数组a的相同规律打乱数组a1
random.shuffle(a1)
print('打乱之后的数据:{0},{1}'.format(a, a1))

打乱之前的数据:[0.1 0.325 0.55 0.775 1. ],[1. 1.25 1.5 1.75 2. ]
打乱之后的数据:[0.55 1. 0.325 0.775 0.1 ],[1.5 2. 1.25 1.75 1. ]

可以看到a1数组是按照与a相同的打乱顺序进行打乱的。
推测random.shuffle()在二维数组中的随机,可能是在新数组的每一行,以正态概率或其他方式随机选取原数组的一个Index写入,此处验证留空,可查询源码了解。
那么如何实现我们的需求呢?
使用numpy中的random.shuffle()函数

c = random.randint(1, 1000)
b = np.arange(20).reshape(10, 2)
print(b)
np.random.seed(c)
np.random.shuffle(b)
print(b)

运行结果如下

打乱之前的原始数据:[[ 0 1]
[ 2 3]
[ 4 5]
[ 6 7]
[ 8 9]
[10 11]
[12 13]
[14 15]
[16 17]
[18 19]]
打乱之后的数据:[[18 19]
[ 6 7]
[16 17]
[10 11]
[12 13]
[ 8 9]
[14 15]
[ 4 5]
[ 2 3]
[ 0 1]]

可以看到原始数据按照我们的要求被顺利打乱了。
参考网站:
https://blog.csdn.net/weixin_35103924/article/details/116169355
https://www.jianshu.com/p/36a4bbb5536e

你可能感兴趣的:(Python,python,开发语言,后端)