np.load报错ValueError:无法将(838715,)数组重塑为(838710,)求助
我想用.npy文件保存数据集的缩放参数,避免每次运行代码重复计算。当前使用sklearn的MaxAbsScaler(),将scaler的max_abs_属性保存到.npy文件,同时把剩余待处理文件列表也存到另一个.npy文件,方便从上次中断的状态继续运行。
处理的是一系列FFT幅度特征,需要缩放到[-1,1]区间,由于数据总量超出内存,因此使用partial_fit()。代码中未使用reshape方法。
遇到的问题:有时(并非每次)运行计算scaler的代码时,会出现维度不匹配错误。
尝试过的操作:在保存剩余文件列表前输出其长度,结果无变化,不符合预期;将列表转为np数组后,仍出现相同错误。
核心代码逻辑如下:
remaining_paths = np.load('remaining_files.npy', allow_pickle=True) list_of_paths = remaining_paths for path in list_of_paths: data = np.load(path,allow_pickle=True) scaler.partial_fit(data) remaining_paths.remove(path) np.save(scaler.max_abs_,'max_abs.npy',allow_pickle=True) remaining_paths.remove(path) np.save(remaining_paths ,'remaining_files.npy',allow_pickle=True)
问题分析与修复方案
1. 遍历与修改列表的冲突
你在遍历list_of_paths的同时,两次调用remaining_paths.remove(path)——由于list_of_paths = remaining_paths是引用赋值,两个变量指向同一列表对象,遍历过程中列表长度被反复缩短,会导致遍历异常、文件处理顺序混乱,间接引发scaler维度不匹配。
修复:遍历列表副本,同时移除重复的remove操作:
# 遍历副本,避免原列表修改影响遍历 for path in list(list_of_paths): data = np.load(path, allow_pickle=True) scaler.partial_fit(data) remaining_paths.remove(path) # 仅保留一次移除操作 np.save('max_abs.npy', scaler.max_abs_, allow_pickle=True) np.save('remaining_files.npy', remaining_paths, allow_pickle=True)
2. np.save参数顺序错误
np.save的参数顺序是文件名在前,待保存数组在后,你写的np.save(scaler.max_abs_,'max_abs.npy',...)完全颠倒,会导致把max_abs_数组当成文件路径处理,必然触发维度或路径相关错误。
修复:调整参数顺序:
# 先写文件名,再写要保存的内容 np.save('max_abs.npy', scaler.max_abs_, allow_pickle=True) np.save('remaining_files.npy', remaining_paths, allow_pickle=True)
3. partial_fit输入维度要求
MaxAbsScaler.partial_fit要求输入为2D数组(样本数×特征数),若单个data是1D数组,即使大部分时候能运行,也会偶发维度不匹配错误。
修复:加载数据后强制转为2D(虽然你之前没用到reshape,但这是scaler接口的必要要求):
data = np.load(path, allow_pickle=True) # 转成2D,确保符合scaler输入要求 data = data.reshape(1, -1) scaler.partial_fit(data)
4. 剩余路径的类型一致性
加载remaining_files.npy得到的是np数组,直接执行列表的remove操作可能存在隐式转换问题,建议转成列表后再处理:
# 加载后转成列表,避免数组与列表操作的差异 remaining_paths = np.load('remaining_files.npy', allow_pickle=True).tolist() list_of_paths = remaining_paths
内容的提问来源于stack exchange,提问作者geani

