如何将非均匀numpy数组转为方形数组?LunarLander环境PyTorch适配问题
解决方案:处理LunarLander环境reset返回值的问题
问题根源
你遇到的所有错误,核心原因是新版Gym(或Gymnasium)的env.reset()方法返回的是(observation, info)元组,而不是单纯的观测数组。你直接把这个元组当成观测数组处理,才会出现"非均匀数组"的错误——因为元组里包含了一个8维数组和一个空字典,长度为2,根本不是需要的观测数据。
正确步骤
修正
env.reset()的接收逻辑
把主程序里的observation = env.reset()改成:observation, info = env.reset()只取元组的第一个元素作为实际观测数据,这才是LunarLander环境返回的固定8维均匀数组(形状为
(8,)),完全不需要补零或reshape。移除多余的补零代码
LunarLander的观测本身就是8维的一维数组,直接可以转换为PyTorch张量,之前的补零操作完全没必要,直接删掉即可。修正智能体的张量转换代码
确保forward函数里正确处理numpy数组:def forward(self, observation): # 直接将numpy数组转为张量,无需额外处理 state = torch.tensor(observation, dtype=torch.float32).to(self.device) x = F.relu(self.fc1(state)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x注意指定
dtype=torch.float32,和原数组的float32类型匹配。验证观测数据
修正后,打印observation会得到类似这样的8维数组:[-0.00508328, 1.4105566 , -0.514903 , -0.01617732, 0.00589709, 0.11663332, 0. , 0. ]这是标准的均匀形状数组,能直接转为PyTorch张量。
错误原因复盘
你之前的补零代码报错,是因为你把(数组, 字典)的元组当成了观测数组,len(observation)返回2,计算出n=2、padding=2,但np.pad无法处理包含数组和字典的元组,所以抛出"非均匀形状"的错误。
内容的提问来源于stack exchange,提问作者Bunny Khatana
相关产品推荐
相关产品推荐

