随机播放vs置换numpy


77

numpy.random.shuffle(x)和之间有什么区别numpy.random.permutation(x)

我已经阅读了文档页面,但是当我只想随机地对数组元素进行随机排列时,我不明白两者之间是否有任何区别。

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

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

Answers:


107

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

2
在上使用时panda.Index,只能使用permutationshuffle不能。这种情况如何适合您的解释?
海森堡,2015年

1
@Heisenberg将permutation其参数强制转换为ndarray(通过复制);pandas.Index与无法使用ndarray的ndarray完全不同shuffle,但是可以使用根据它创建的ndarray进行工作。
ecatmur

31

np.random.permutation当您需要随机排列有序对时,尤其是对于分类,添加@ecatmur所说的内容很有用:

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]

1
我一直得到这个:TypeError:只有整数标量数组可以转换为标量索引
john ktejik

2
为了澄清@ hlin117,这仅在x和y是numpy数组时有效。如果您尝试使用python内置列表执行此操作,则会抛出TypeError。
benjaminjsanders

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)更改了原始数据,并且不返回新变量。我只是想举一个例子来说明它可以帮助其他人。谢谢!!


1

permutation()方法返回一个重新排列的数组(并使原始数组保持不变),该方法将保持原始数组不变并返回经过改组的数组,例如x = [1,4,2,8]是原始数组,并且排列方法将返回重新排列的数组(让我们说[8,4,1,2])。现在,您有两个数组,原始数组和重新排列的数组。

另一方面,

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.