调用reconstruct_flight函数报reshape size 0错误 单独跑循环正常是什么原因
问题原因分析
核心问题是函数内部误用了未作为入参传入的全局变量data_clean,和实际切片操作的数据源data长度不匹配:
- 你定义的
reconstruct_flight函数入参只有data、sequence_lenght、flight_len、param_len,没有把data_clean作为参数传入 - 直接在控制台运行循环逻辑时,当前运行环境的全局作用域中存在
data_clean变量,且此时data_clean和你用到的data长度一致,循环范围和切片操作匹配,所以不会触发报错 - 封装为函数调用时,Python会优先查找全局作用域的
data_clean,如果此时你传入函数的data长度远小于全局data_clean的长度,循环上限会按照更长的data_clean长度计算,当i超过data的总长度后,data[i:i+stack_factor]会得到空数组,空数组size为0自然无法reshape为(1500,77)的形状,就会抛出你遇到的ValueError
额外注意:你的参数名sequence_lenght存在拼写错误,正确拼写应为sequence_length,如果调用时传参和参数名不匹配也可能引发关联问题。
修复方案
统一循环范围和切片操作的数据源即可,修改后的参考代码如下:
import numpy as np def reconstruct_flight(data, sequence_length, flight_len, param_len): # 修正参数拼写错误 stack_factor = int(flight_len/sequence_length) data_reconstructed = [] # 循环范围改用传入的data的长度,和后续切片操作匹配 for i in range(0, len(data), stack_factor): slice_data = data[i:i+stack_factor] # 增加切片长度判断,避免末尾不足长度的无效切片报错 if len(slice_data) == stack_factor: data_reconstructed.append( slice_data.reshape([flight_len, param_len]) ) return np.array(data_reconstructed)
内容的提问来源于stack exchange,提问作者Yoan B. M.Sc
相关产品推荐
相关产品推荐

