樣本數據混洗——用numpy簡單實現

                         QQ:3020889729                                                                                 小蔡

特別聲明

數據混洗的函數應該在相關一些模塊中都有包含,但是有時候自己一時想不起來,不如自己用熟悉的模塊來寫寫,補充自己的應用。(僅作學習參考)

混洗思路

採用numpy自帶的random下的permutation,獲取一維數據的混洗後的索引數據,然後根據混洗後索引來取原數據,即對原數據進行有對應關係的打亂。

應用

大數據應用以及人工智能學習時,對數據樣本的打亂,但是不破壞數據間的相關性。

混洗代碼

import numpy as np


def data_shuffle(*data, x):
    '''函數說明:

    @param: *data,需要混洗的數據——允許是多個相關的list或者narray
    @param: x,混洗的長度——即混洗的第0軸的大小對應的np.arange(len(x[axis=0]))的一維隨機混洗的大小
    *data任意個~
    x可以是作爲混洗的長度的int,也可以是作爲混洗依據的list/narray

    主要實現思路:
        採用numyp的random下的permutation實現返回指定大小的一維隨機交換——多維數組即是對第0軸的隨機交換,也就是行作隨機混洗順序;
            1.隨機實現行切換位置——返回混洗後的行的list[1,2,3]->list[3,1,2]
    '''
    assert len(data) > 0
    
    shuffle_data = []     # 放混洗後的數據
    permutation = np.random.permutation(x)  # 按輸入指定打亂數據的第一維(即行順序打亂,返回打亂後的行數據)
    for i in data:
        i = i[permutation]  # 以打亂的行號來索引原數據獲得新數據——即混洗後的數據
        shuffle_data.append(i)   # 把每一個混洗後的數據添加到shuffle_data
    return shuffle_data

效果演示

import shuffle   # 引入我們寫好的混洗.py
import numpy as np
# 注意不要輕易設定隨機數種子,否則可能混洗失敗

'''測試數據說明:

data1與data2爲將要混洗的數據——且data1與data2一一對應
即:data1的第一行,對應data2的第一個元素——data1[0]  <-->  data2[0]
'''
data1 = np.random.randint(-10, 10, (3, 3))
data2 = np.arange(1, 4)

# print("數據混洗前:")
# print("data1: \n{0}".format(data1))   # 當前的數據內容
# print("data2: \n{0}".format(data2))

'''混洗操作說明:

1.確定同時混洗的數據——至少有一個;
2.確定混洗的長度——即第一維度的大小(選取同時混洗的相關數據的一個即可)
3.輸入幾個數據,對應順序返回幾個數據多個數據以list返回,可以索引
'''
data = shuffle.data_shuffle(data1, data2, x=len(data2))

print("\n\n數據混洗後:")
print("data1:\n{0}\nshuffle_data1:\n{1}".format(data1, data[0]))
print("\n\ndata2:\n{0}\nshuffle_data2:\n{1}".format(data2, data[1]))

結果展示:
在這裏插入圖片描述
補充:如果需要對單個一維數組進行打亂,也是一樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章