Python中访问train[1]、label[1]触发IndexError的解决方法
问题根因
报错的核心原因是滑窗逻辑和数组初始化逻辑冲突,生成的train和label本质是第一维长度为0的空数组,任何索引访问都会触发越界:
- 初始化数组时你设置
window_length = 983,和总数据行数number_of_rows=983相等,因此第一维长度计算为983 - 983 = 0,直接生成了shape为(0, 983, 6)的空train、shape为(0,6)的空label - 之后你修改
window_length = 982,但没有重新初始化两个数组,numpy数组的shape不会随变量值自动更新 - 循环范围
range(0, number_of_rows-window_length)等价于range(0,1),仅会执行1次i=0的循环,给空数组的0索引赋值属于无效操作,数组始终为空。你以为能正常访问的train[0]只是numpy空数组的异常返回,没有存储任何有效数据 - 额外的逻辑错误:标签切片
transformed_df.iloc[i:i+window_length:i+window_length+1,0:number_of_features]用了和索引绑定的动态步长,根本取不到正确的预测目标值。
修复方案
你要实现的是时序滑窗样本构造:用连续N条历史数据预测紧邻的下1条数据,正确逻辑是先确定合理的滑窗长度,计算有效样本数后再初始化数组、循环赋值,修复后的代码如下:
import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler # 假设my_list已定义,共983条6列数据 df = pd.DataFrame(np.array(my_list), columns=list('ABCDEF')) # 标准化 scaler = StandardScaler().fit(df.values) transformed_dataset = scaler.transform(df.values) transformed_df = pd.DataFrame(data=transformed_dataset, index=df.index) number_of_rows = transformed_df.shape[0] number_of_features = transformed_df.shape[1] # 设置滑窗长度:不要设置为和总样本数接近/相等的值,否则构造不出有效样本 # 例如下方设置为用前20条历史数据预测下1条,可根据你的业务需求调整 window_length = 20 # 计算有效样本总数 sample_count = number_of_rows - window_length # 初始化正确维度的数组 train = np.empty([sample_count, window_length, number_of_features], dtype=float) label = np.empty([sample_count, number_of_features], dtype=float) # 循环构造滑窗样本 for i in range(sample_count): # 取连续window_length行作为输入特征 train[i] = transformed_df.iloc[i:i+window_length, :number_of_features].values # 取窗口结束位置紧邻的下一行作为预测标签 label[i] = transformed_df.iloc[i+window_length, :number_of_features].values # 维度验证:window_length=20时,train.shape为(963, 20, 6),label.shape为(963,6) # 此时访问train[0]、train[1]、label[0]、label[1]均不会触发索引越界 print(train.shape, label.shape)
注意事项
- 滑窗长度必须远小于总样本数:如果设置
window_length=982,最终只能生成1个有效样本(前982条预测最后1条);设置window_length=983则一个有效样本都无法生成 - 所有和数组维度相关的参数,必须在数组初始化前确定,初始化完成后不要随意修改,否则数组维度不会自动同步
- 构造时序预测标签时不要用动态步长切片,直接取窗口后第一行即可,动态步长很容易取到空值或者错位的标签。
内容的提问来源于stack exchange,提问作者anagnam
相关产品推荐
相关产品推荐

