在处理数据的时候,需要把不同长度的数据变成相同长度,百度了半天没有找到相关的,于是自己用python写了一个数据长度归一化。
原理:如果数据长度与要归一化的长度相同,直接返回;如果数据长度大于要归一化的长度,按照超长的间隔舍弃;如果数据长度小于要归一化的长度,按照缺少的间隔增加与之相邻的数据,在此我是直接复制的上一个数据,如果需要可以根据需求按照相应方式添加。舍弃或者增加的间隔除出来肯定不是整数,在此通过一个小的for循环处理掉除出来是整数的部分,然后没遍历依次将余数相加,如果余数和1相减小于1,则进行依次数据舍弃或者数据增加。经过这样处理后最后的数据长度与需要的真实长度之间有时会存在1的误差,故再通过在末尾添加0或者舍弃一位实现。
程序源码如下:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# author:SingWeek
def samelen(data,length=300):
"""
数据长度归一化
:param data:以数组形式输入需要归一化的数据
:param length:归一化后的长度
:return:result:归一化后的数据返回值
"""
result=[]
truelen=len(data)
if truelen==length:
return data
elif truelen>length:
integer=int(truelen/length)
decimal=truelen-length*integer
mid=decimal/truelen
tmp=0
for i in range(0,truelen,integer):
tmp+=mid
if tmp-1>=0:
tmp-=1
else:
result.append(data[i])
resulttmp=len(result)
if resulttmp==length:
return result
elif resulttmp<length:
for i in range(length-resulttmp):
result.append(0.0)
return result
else:
return result[:length]
else:
integer=int(length/truelen)
decimal=length-truelen*integer
mid=decimal/truelen
tmp=0
for i in range(truelen):
for j in range(integer):
result.append(data[i])
tmp+=mid
if tmp-1>=0:
result.append(data[i])
tmp-=1
resulttmp=len(result)
if resulttmp==length:
return result
elif resulttmp<length:
for i in range(length-resulttmp):
result.append(0.0)
return result
else:
return result[:length]
其他样本数据的归一化已经有了,在此不做过多阐述,可以参考博文:
https://blog.csdn.net/u011650143/article/details/71515927
https://blog.csdn.net/pipisorry/article/details/52247379