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]))
結果展示:
補充:如果需要對單個一維數組進行打亂,也是一樣。