取 shuffle 的过程其实可看做从全排列中随机选择一个的过程。

稍微比较麻烦的是实现特征向量与类别标签的同步shuffle。



如果这里数据集既包含特征向量又包括标签值,可直接调用np.random.shuffle()方法:



>>> np.random.shuffle(training_data) 

 >>> X = training_data[:, :-1] 

 >>> y = trianing_data[:, -1]



如果已对数据集的特征向量与类别标签列进行分离,这里提供两种方式进行同步shuffle:



法 I:使用 np.random.shuffle()



>>> training_data = np.hstack(X, y) 

 >>> np.random.shuffle(training_data) 

 >>> X = training_data[:, :-1] 

 >>> y = training_data[:, -1]



法 II:np.random.permutation() 对行索引进行一次全排列



按列 shuffle

>>> r = np.random.permutation(len(y)) 

                                 # 随机地从全排列中选取一个,实现 shuffle 

 >>> X = X[r, :]  

 >>> y = [r]



上文所述皆是对矩阵的行(样本矩阵的每一个样本)进行 shuffle,那么该如何 shuffle 矩阵的列呢(也即样本矩阵的每一个属性)



仍然存在两种方案,



法 I:np.random.shuffle()



因为 np.random.shuffle() 直接对原始矩阵进行修改(返回值为NoneType),且不接受另外的参数,我们可对原始矩阵的转置 



shuffle 之后,再转置



>>> training_data = np.hstack(X, y) 

 >>> training_data = training_data.T 

 >>> np.random.shuffle(training_data) 

 >>> training_data = training_data.T 

 >>> X = training_data[:, :-1] 

 >>> y = training_data[:, -1]



法 II:np.random.permutation() 对列索引进行一次全排列



# 此时 y 参与 shuffle


>>> r = np.random.permutation(X.shape[1])


>>> X[:, r]



#-*- encoding:utf-8 -*-
import pandas as pd
import numpy as np
import random


def test3():
    df = pd.DataFrame(np.random.randn(4, 2), columns=list('ab'))
    print df
    m1 = df.values
    np.random.shuffle(m1)
    df = pd.DataFrame(m1, columns=list('ab'))
    print df

def test4():
    '''
    np.random.shuffle和random.shuffle是不同的,random.shuffle只能是数组random.shuffle
    :return:
    '''
    list = [20, 16, 10, 5];
    np.random.shuffle(list)
    print "随机排序列表 : ", list

    np.random.shuffle(list)
    print "随机排序列表 : ", list

test3()