93

numpy.random.shuffle(x)和 和有什么不一样numpy.random.permutation(x)

我已经阅读了文档页面,但是当我只想随机打乱数组的元素时,我无法理解两者之间是否有任何区别。

更准确地说,假设我有一个数组x=[1,4,2,8]

shuffle(x)如果我想生成 x 的随机排列,那么和之间有什么区别permutation(x)

4

4 回答 4

124

np.random.permutation与 有两个不同np.random.shuffle

  • 如果传递一个数组,它将返回该数组的洗牌副本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
于 2013-03-18T10:18:21.457 回答
36

补充@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]
于 2015-12-06T21:26:20.077 回答
3

permutation() 方法返回一个重新排列的数组(并且保持原始数组不变),该方法将保持原始数组不变并返回一个打乱的数组,例如 x = [1,4,2,8]是原始数组,置换方法将返回重新排列的数组(比如说 [8,4,1,2])。现在,您有两个数组,原始数组和重新排列的数组。

另一方面,

shuffle() 方法对原始数组进行更改,例如 x = [1,4,2,8] 是原始数组,并且 shuffle 方法将返回 shuffle 数组(假设 shuffled 数组是 [8,4,1 ,2])。现在,原始数组本身已更改为 Shuffled 数组,您只剩下 shuffled 数组。

参考:- https://www.w3schools.com/python/numpy_random_permutation.asp

于 2020-06-10T13:51:48.133 回答
1

添加@ecatmur,这是一个简短的解释。首先,我创建了一个形状为 3,3 且数字从 0 到 8 的数组

import numpy as np
x1 = np.array(np.arange(0,9)).reshape(3,3) #array with shape 3,3 and have numbers from 0 to 8

#step1: using np.random.permutation
x_per = np.random.permutation(x1)
print('x_per:', x_per)
print('x_1:', x_1)
#Inference: x1 is not changed and x_per has its rows randomly changed

#The outcome will be 
x1: [[0 1 2]
     [3 4 5]
     [6 7 8]]
x_per:[[3 4 5]
       [0 1 2]
       [6 7 8]]
#Lets apply shuffling
x2 = np.array(range(9)).reshape(3,3)
x2_shuffle = np.random.shuffle(x2)
print('x2_shuffle:', x2_shuffle)
print('x2', x2)

#Outcome: 
x2_shuffle: None
x2 [[3 4 5]
    [0 1 2]
    [6 7 8]]

关键推断是:当 x 是一个数组时,numpy.random.permutation(x) 和 numpy.random.shuffle(x) 都可以沿第一个轴随机排列 x 中的元素。numpy.random.permutation(x) 实际上返回一个新变量并且原始数据没有改变。其中 numpy.random.shuffle(x) 已更改原始数据并且不返回新变量。我只是试图用一个例子来展示,这样它就可以帮助别人。谢谢!!

于 2020-04-16T11:13:26.113 回答