问题:
最近在写滑动窗口的代码,因为有下标的问题,但是解决完后突然发现之前虽然生成的数据多了竟然没有报下标超出边界的异常,于是发现了下面这个问题。
结论:
假如数据共500(index0~400),那么data[500]会报错,而data[:550]不会报错。
也就是说:切片的时候,下标data[index1:index2]超出边界不会报错,只会展示数据中已有的数据。而索引data[index]会报错.谨记!!!
测试代码如下:
滑动窗口
公式如下:
公式:time总时间步数500-input输入的时间数10-output输出的时间数10 + 固定的1 =datanum481条数据(time-input-output+1 = datanum)
代码如下:
import numpy as np
import torch
old_data = np.zeros((2000, 1, 3))
# 已验证算法正确,且已修复生成赝本数目:
#通过合并后的data获得时间窗口的data,和原本的data_cp,还有数据合并后的列数
"""
输入:原始数据data(shape=[1500, 48824, 3])。input_size,output_size分别为输入窗口和输出窗口的大小
输出:两个长度为10的数据集data_input[(1481, 48824, 3)和data_output(1481, 48824, 3),和一个原始数据集data_cp([1500, 48824, 3])
易错:不是1480,是1481条数据
"""
input_size = 10
output_size = 10
def getData(data, input_size, output_size):
data = torch.tensor(data, dtype=torch.float)
""" 没有归一化数据 """
data_cp = data
print(data.shape)
# 将单个样本数据转为多个样本预测数据
def sliding_window(data, input_size, output_size):
num_samples = data.shape[0] - input_size - output_size + 1
print("num_samples:", num_samples)
input_list = []
output_list = []
for i in range(num_samples):
input_data = data[i:i + input_size]
output_data = data[i + input_size:i + input_size + output_size]
input_stacked = torch.cat([input_data[j] for j in range(input_size)], dim=-1)
output_stacked = torch.cat([output_data[j] for j in range(output_size)], dim=-1)
input_list.append(input_stacked)
output_list.append(output_stacked)
combined_input_tensor = torch.stack(input_list)
combined_output_tensor = torch.stack(output_list)
return combined_input_tensor, combined_output_tensor
# 生成滑动窗口数据
data_input, data_output = sliding_window(data, input_size, output_size)
print(f"data_input.shape: {data_input.shape}")
print(f"data_output.shape: {data_output.shape}")
print(f"data_cp.shape: {data_cp.shape}")
return data_input, data_output, data_cp
data_input0, data_output0, data_cp0 = getData(old_data, input_size, output_size)
输出结果如下:
torch.Size([2000, 1, 3])
num_samples: 1981
data_input.shape: torch.Size([1981, 1, 30])
data_output.shape: torch.Size([1981, 1, 30])
data_cp.shape: torch.Size([2000, 1, 3])