numpy中的洗牌与排列
`numpy.random.shuffle(x)`和`numpy.random.permutation(x)`有什么区别呢?
我看过文档,但还是不太明白这两个在我想随机打乱一个数组的元素时有什么不同。
为了更清楚,假设我有一个数组`x=[1,4,2,8]`。
如果我想生成`x`的随机排列,那么`shuffle(x)`和`permutation(x)`之间有什么区别呢?
4 个回答
permutation() 方法会返回一个重新排列的数组,同时保持原始数组不变。这意味着原始数组会保持原样,而返回的是一个打乱顺序的新数组。例如,假设 x = [1,4,2,8] 是原始数组,使用 permutation 方法后会得到一个重新排列的数组(比如说是 [8,4,1,2])。这样,你就有了两个数组,一个是原始数组,一个是重新排列后的数组。
另一方面,
shuffle() 方法会直接改变原始数组。例如,x = [1,4,2,8] 是原始数组,使用 shuffle 方法后会得到一个打乱顺序的数组(假设打乱后的数组是 [8,4,1,2])。这时,原始数组本身就变成了打乱后的数组,你只剩下这个打乱后的数组了。
参考链接:https://www.w3schools.com/python/numpy_random_permutation.asp
接着@ecatmur说的内容,np.random.permutation
这个函数在你需要打乱有序的配对时特别有用,尤其是在分类任务中:
from np.random import permutation
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
# Data is currently unshuffled; we should shuffle
# each X[i] with its corresponding y[i]
perm = permutation(len(X))
X = X[perm]
y = y[perm]
np.random.permutation
和 np.random.shuffle
有两个主要区别:
- 如果你给它一个数组,
np.random.permutation
会返回这个数组的一个打乱的副本;而np.random.shuffle
是直接在原数组上进行打乱。 - 如果你给它一个整数,它会返回一个打乱的范围,也就是说,
np.random.shuffle(np.arange(n))
。
如果 x 是一个整数,就随机打乱
np.arange(x)
。如果 x 是一个数组,就先复制一份,然后随机打乱里面的元素。
查看源代码可能会帮助你理解这个内容:
3280 def permutation(self, object x):
...
3307 if isinstance(x, (int, np.integer)):
3308 arr = np.arange(x)
3309 else:
3310 arr = np.array(x)
3311 self.shuffle(arr)
3312 return arr