filter_observation.py模块中类

FilterObservation(ObservationWrapper) 的理解。

代码:

import copy

from gym import spaces
from gym import ObservationWrapper class FilterObservation(ObservationWrapper):
"""Filter dictionary observations by their keys. Args:
env: The environment to wrap.
filter_keys: List of keys to be included in the observations. Raises:
ValueError: If observation keys in not instance of None or
iterable.
ValueError: If any of the `filter_keys` are not included in
the original `env`'s observation space """
def __init__(self, env, filter_keys=None):
super(FilterObservation, self).__init__(env) wrapped_observation_space = env.observation_space
assert isinstance(wrapped_observation_space, spaces.Dict), (
"FilterObservationWrapper is only usable with dict observations.") observation_keys = wrapped_observation_space.spaces.keys() if filter_keys is None:
filter_keys = tuple(observation_keys) missing_keys = set(
key for key in filter_keys if key not in observation_keys) if missing_keys:
raise ValueError(
"All the filter_keys must be included in the "
"original obsrevation space.\n"
"Filter keys: {filter_keys}\n"
"Observation keys: {observation_keys}\n"
"Missing keys: {missing_keys}".format(
filter_keys=filter_keys,
observation_keys=observation_keys,
missing_keys=missing_keys,
)) self.observation_space = type(wrapped_observation_space)([
(name, copy.deepcopy(space))
for name, space in wrapped_observation_space.spaces.items()
if name in filter_keys
]) self._env = env
self._filter_keys = tuple(filter_keys) def observation(self, observation):
filter_observation = self._filter_observation(observation)
return filter_observation def _filter_observation(self, observation):
observation = type(observation)([
(name, value)
for name, value in observation.items()
if name in self._filter_keys
])
return observation

该类的一个前提要求是传入的内部env必须是状态空间属于spaces.Dict类的,如下:

        assert isinstance(wrapped_observation_space, spaces.Dict), (
"FilterObservationWrapper is only usable with dict observations.")

该类的意思就是将传入的状态空间为spaces.Dict类型的env中的属于filter_keys的key保留下其他的不保留。

内部的包装类的所有key为env.observation_space.spaces.keys() 。

如果需要保留下来的key本身不存在与内部包装类中,则记录下来:

        missing_keys = set(
key for key in filter_keys if key not in observation_keys)

并报错:

        if missing_keys:
raise ValueError(
"All the filter_keys must be included in the "
"original obsrevation space.\n"
"Filter keys: {filter_keys}\n"
"Observation keys: {observation_keys}\n"
"Missing keys: {missing_keys}".format(
filter_keys=filter_keys,
observation_keys=observation_keys,
missing_keys=missing_keys,
))

每次获得内部类的observation后都按照过滤的key对其进行处理将过滤后的observation向上传递:

    def observation(self, observation):
filter_observation = self._filter_observation(observation)
return filter_observation def _filter_observation(self, observation):
observation = type(observation)([
(name, value)
for name, value in observation.items()
if name in self._filter_keys
])
return observation

=========================================

gym库中类FilterObservation(ObservationWrapper)的理解的更多相关文章

  1. obj-c编程10:Foundation库中类的使用(2)[字符串,数组]

    Foundation库的内容不可谓不多,就算很精简的说篇幅也受不了啊!笨猫一向反对博客文章一下子拖拖拉拉写一大坨!KISS哦!so将上一篇文章再分一篇来说,于是有了这篇,可能还会有(3)哦... 我发 ...

  2. 手写一个虚拟DOM库,彻底让你理解diff算法

    所谓虚拟DOM就是用js对象来描述真实DOM,它相对于原生DOM更加轻量,因为真正的DOM对象附带有非常多的属性,另外配合虚拟DOM的diff算法,能以最少的操作来更新DOM,除此之外,也能让Vue和 ...

  3. obj-c编程10:Foundation库中类的使用(3)[文件管理]

    好吧,不管神马系统都无可避免的要说到文件,目录,路径(PATH)管理的内容,下面我们来看看在F库中对他们的支持.我简单看了下,不谈其他光从方法命名来说就多少显得有点复杂,如果和ruby相比就呵呵了. ...

  4. obj-c编程10:Foundation库中类的使用(6)[线程和操作队列]

    任何语言都不能避而不谈线程这个东东,虽然他是和平台相关的鸟,虽说unix哲学比较讨厌线程的说...线程不是万能灵药,但有些场合还是需要的.谈到线程就不得不考虑同步和死锁问题,见如下代码: #impor ...

  5. obj-c编程10:Foundation库中类的使用(5)[时间对象]

    隔了好久才有了这新的一篇,还是无奈的时间啊!so这次我们就着重谈谈它喽. F库中有很多时间相关的类,比如NSDate,NSTimeInterval,NSTimeZone,NSDateComponent ...

  6. conda常用命令,如何在conda环境中安装gym库?

    查看已安装的环境: conda info -e 或 conda env list 创建新环境gymlab: conda create -n gymlab python=3.5 激活环境gymlab: ...

  7. C++中类模板的深入理解

    1,多参数类模板: 1,类模板可以定义任意多个不同的类型参数: 1,代码示例: template <typename T1, typename T2> class Test { publi ...

  8. 科学计算库Numpy基础&提升(理解+重要函数讲解)

    Intro 对于同样的数值计算任务,使用numpy比直接编写python代码实现 优点: 代码更简洁: numpy直接以数组.矩阵为粒度计算并且支持大量的数学函数,而python需要用for循环从底层 ...

  9. obj-c编程10:Foundation库中类的使用(4)[文件管理,查询当前进程信息]

    接上一篇文件管理博文.我们可以用NSPathUtilities.h中包含的NSString函数和分类扩展来以兼容的方式处理路径.下面凡是有系统编程经验的童鞋都知道是啥意思了: #import < ...

  10. obj-c编程10:Foundation库中类的使用(1)[数字,字符串]

    我们知道在mac或iphone上编程最终逃不开os x平台,你无法在windows或linux上开发纯正的apple程序.(so不要舍不得银子买mac啦)虽说linux和windows上有移植的obj ...

随机推荐

  1. 第三届机器人、人工智能与信息工程国际学术会议(RAIIE 2024)

    [ACM独立出版/Fellow大咖云集]2024年第二届机器人.人工智能与信息工程国际学术会议(RAIIE 2024) 2024 3rd International Symposium on Robo ...

  2. raksmart服务器部署SSL报错:ERR_CERT_COMMON_NAME_INVALID

    背景:raksmart服务器 下篇 部署项目 SSL报错:ERR_CERT_COMMON_NAME_INVALID 安装certbot sudo apt update sudo apt install ...

  3. 漏洞复现之CVE-2012-1823(PHP-CGI远程代码执行)

    关于CGI知识点 `CGI模式下的参数: -c 指定php.ini文件的位置 -n 不要加载php.ini文件 -d 指定配置项 -b 启动fastcgi进程 -s 显示文件源码 -T 执行指定次该文 ...

  4. 安装PHP5.6.20

    安装php的前提是安装了数据库和httpd!!!!!!!! 1 因为yum缺省安装的是PHP5.4,所以先要添加yum库 [root@svnhost ~]# rpm -Uvh https://mirr ...

  5. Apache Kylin(三)Kylin上手

    Kylin 上手 根据Kylin 官方给出的测试数据,我们实际操作一下 Kylin. 1. 导入 Hive 数据 首先创建一个project,在界面左上角有个"Add Project&quo ...

  6. rsync 的使用

    背景 原文地址:Rsync参数说明及使用文档(给我自己看的) 一.前言 最近发现rsync挺好用的--不过参数有点多,所以这儿写一篇给自己以后要用的时候做个参考. 二.参数说明 这儿全是我翻资料连蒙带 ...

  7. Ubuntu20.04之Nvidia驱动安装

    参考:https://blog.csdn.net/xiaokedou_hust/article/details/82187860,实际操作时和该博文有些出入,故作优化. s1.连接wifi,打开终端. ...

  8. Java异步判断线程池所有任务是否执行完成的方法

    1.使用ExecutorService和CountDownLatch的方法示例 在Java中,当我们使用线程池(如ExecutorService)来执行异步任务时,常常需要知道所有任务是否都已经完成. ...

  9. 【java深入学习第1章】深入探究 MyBatis-Spring 中 SqlSession 的原理与应用

    前言 在使用 MyBatis 进行持久层开发时,通常会与 Spring 框架集成,以便更好地管理事务和依赖注入.在 MyBatis-Spring 集成中,SqlSession 是一个非常重要的概念.本 ...

  10. 【java深入学习第2章】Spring Boot 结合 Screw:高效生成数据库设计文档之道

    在开发过程中,数据库设计文档是非常重要的,它可以帮助开发者理解数据库结构,方便后续的维护和扩展.手动编写数据库设计文档不仅耗时,而且容易出错.幸运的是,可以使用Spring Boot和Screw来自动 ...