np.stack报ValueError: need at least one array to stack错误排查
问题原因及修复方案
核心错误:preprocess函数行列索引混淆
你当前的preprocess函数中错误使用了行切片代替列索引,直接导致标记列数值被篡改,后续序列切分逻辑完全不触发:
# 原错误写法 def preprocess(self, data): self.maxZ = np.max(data[:2]) # 此处取的是前2行的所有列最大值,不是第2列(Z轴) data[:2] = data[:2]/self.maxZ # 仅修改前2行所有列的值 data[:0] = data[:0]/1525 # 空行切片,无任何执行效果 data[:1] = data[:1]/2740 # 仅修改前1行所有列的值 return data
你原本要实现的是按列归一化,正确写法如下:
# 修复后写法 def preprocess(self, data): # iloc[:, 列索引] 才是取指定列所有行的写法 self.maxZ = np.max(data.iloc[:,2]) print(self.maxZ) data.iloc[:,2] = data.iloc[:,2]/self.maxZ # Z轴列归一化 data.iloc[:,0] = data.iloc[:,0]/1525 # X轴列归一化 data.iloc[:,1] = data.iloc[:,1]/2740 # Y轴列归一化 return data
原错误写法会导致你用来判断新序列的第3列(索引3)的标记值1被错误做了除法运算,转int后变为0,if int(df_arr.iloc[i,3])==1的条件永远不触发,后续append逻辑完全不会执行,最终列表为空。
其他可能的排查点
- 确认原始CSV文件的第4列(对应索引3)确实存在值为1的行,标记新序列的起始/结束位置
- 确认你传入的
seq_len参数值小于单个序列的长度,只有当切出的seq.shape[0] >= seq_len +1时才会进入while循环执行append操作 - 确认类的
__init__方法中已经初始化了self.X、self.X_raw、self.labels三个空列表,避免append操作失败 - 调试时可以将
verbose参数设为True,查看打印的数据集形状、序列加载数量是否符合预期,也可以在if int(df_arr.iloc[i,3])==1分支中加打印,确认是否成功触发了序列切分逻辑。
内容的提问来源于stack exchange,提问作者cxxx
相关产品推荐
相关产品推荐

