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]))
结果展示:
补充:如果需要对单个一维数组进行打乱,也是一样。