Python: 为什么random.shuffle会改变数组?

7

我正在使用random.shuffle对一个二维的numpy数组进行洗牌。但是遇到了以下问题:

import numpy as np
from random import shuffle as sf 

b = np.array([1,2,3,4,5])
print b
# [1 2 3 4 5]
sf(b)
print b
# [1 4 5 3 2]

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print a
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]
sf(a)
print a
# [[1 2 3]
#  [4 5 6]
#  [1 2 3]]

结果显示,当对一维数组进行洗牌时,一切正常。但是当对二维数组进行洗牌时,结果就变得奇怪了。
为什么原始数组的第三行被抛弃了,而第一行被复制了两次?
我知道可能会有解决此问题的方法,例如首先对表示行 ID 的一维数据进行洗牌,然后按照洗牌后的 ID 顺序提取二维数组。但我确实想搞清楚random.shuffle的实现情况,或者我的代码哪里出了问题。

这浪费了我很多时间,花了我一周的时间才发现random.shuffle在这种情况下不起作用。 - Blackberry
1个回答

9
< p >来自random模块的洗牌功能不适用于numpy数组,因为它与嵌套的Python列表不完全相同。您应该使用numpy.random模块的shuffle代替。< /p >
import numpy as np
from numpy.random import shuffle

arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
shuffle(arr)
print(arr)
# output:
# [[4 5 6]
# [1 2 3]
# [7 8 9]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接