无法将训练数据保存至Numpy文件:形状不兼容报错求助
解决numpy保存游戏训练数据时的形状不兼容报错
报错原因
numpy的np.save()要求待保存的数据能转换为形状完全均匀的数组。你的training_data列表中每个元素是[屏幕数组, 输出值],其中屏幕数组是固定的(160,120)二维结构,但如果output的形状/长度不统一,或者直接将嵌套列表转数组时结构存在冲突,就会触发“非均匀形状”的 ValueError。
可行解决方案
方案1:拆分屏幕数据与输出数据,分别保存(推荐)
将屏幕数据和输出数据拆分为两个独立的均匀数组,用np.savez()打包保存(支持一次存储多个数组),既避免形状问题,也方便后续加载使用:
while (True): if not paused: screen = grab_screen(region=(0, 40, 800, 640)) screen = cv2.cvtColor(screen, cv2.COLOR_BGR2GRAY) screen = cv2.resize(screen, (160, 120)) keys = key_check() output = keys_to_output(keys) training_data.append([screen, output]) if len(training_data) % 100 == 0: print(len(training_data)) # 拆分出屏幕和输出数组 screens = np.array([item[0] for item in training_data]) outputs = np.array([item[1] for item in training_data]) # 用savez打包保存,文件名加上序号区分批次 np.savez(f'training_batch_{len(training_data)}.npz', screens=screens, outputs=outputs) # 清空列表,避免后续重复存储已有数据 training_data = []
后续加载数据时:
data = np.load('training_batch_100.npz') screens = data['screens'] # 形状(100, 160, 120) outputs = data['outputs'] # 形状(100, ...),取决于你的output实际结构
方案2:使用结构化数组统一存储
如果你的output是固定形状的标量或短数组,可以将数据转换为numpy结构化数组,强制统一结构:
while (True): if not paused: # 省略前面的屏幕处理和输出计算代码 training_data.append([screen, output]) if len(training_data) % 100 == 0: print(len(training_data)) # 定义结构化数据类型:屏幕是(160,120)的float32数组,输出是int32标量(根据实际情况调整) dtype = [('screen', 'float32', (160, 120)), ('output', 'int32')] structured_data = np.array([(item[0], item[1]) for item in training_data], dtype=dtype) np.save(file_name, structured_data) training_data = []
这种方法适合输出结构固定的场景,但后续数据读取和预处理的灵活性不如方案1。
内容的提问来源于stack exchange,提问作者Saswat Behera
相关产品推荐
相关产品推荐

