易错:python滑动窗口生成样本和标签的代码,遇到数据切片的陷阱,假如数据共500(index0~400),那么data[500]会报错,而data[:550]不会报错

问题:  

最近在写滑动窗口的代码,因为有下标的问题,但是解决完后突然发现之前虽然生成的数据多了竟然没有报下标超出边界的异常,于是发现了下面这个问题。

结论:  

假如数据共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])

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱生活的五柒

谢谢你的打赏,人好心善的朋友!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值