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. unsupported operand type(s) for +: 'function' and 'str'

    unsupported operand type(s) for +: 'function' and 'str' 报错解释:这个错误表明你尝试将一个函数和一个字符串进行加法操作,在Python中,加法不 ...

  2. 阿里也出手了!Spring CloudAlibaba AI问世了

    写在前面 在之前的文章中我们有介绍过SpringAI这个项目.SpringAI 是Spring 官方社区项目,旨在简化 Java AI 应用程序开发, 让 Java 开发者想使用 Spring 开发普 ...

  3. ​Chrome插件:Postman Interceptor 调试的终极利器

    今天给大家介绍一款非常实用的工具--Postman Interceptor. 这个工具可以捕捉任何网站的请求,并将其发送到Postman客户端. 对于经常和API打交道的程序员来说,Postman I ...

  4. 写给rust初学者的教程(一):枚举、特征、实现、模式匹配

    这系列RUST教程一共三篇.这是第一篇,介绍RUST语言的入门概念,主要有enum\trait\impl\match等语言层面的东西. 安装好你的rust开发环境,用cargo创建一个空项目,咱们直接 ...

  5. 基于SSD202D芯片的最小嵌入式Linux开发板来了 仅需99元 入门嵌入式Linux必选

  6. css3 动画插件Animate.css

    官网:https://animate.style/ GitHub:https://github.com/daneden/animate.css

  7. socket通讯原理及例程(一看就懂

    来源:https://blog.csdn.net/jiushimanya/article/details/82684525 里面有疑问或者不正确的地方可以给我留言 对TCP/IP.UDP.Socket ...

  8. 个人使用 sudo 方法

    sudo 作用:允许 系统管理员 授予某些用户或用户组以 其他用户身份 运行某些或所有命令的权限 su 用于变更为其他使用者的身份的命令,一般需要键入该使用者的密码 sudo 则是对 su 使用的简化 ...

  9. 番外篇: go语言写的简要数据同步工具

    go-etl工具 作为go-etl工具的作者,想要安利一下这个小巧的数据同步工具,它在同步百万级别的数据时表现极为优异,基本能在几分钟完成数据同步. 1.它能干什么的? go-etl是一个数据同步工具 ...

  10. 洛谷P10693

    洛谷P10693 好奇怪的题目编号 思路提取 input 11 2 13 4 5 3 7 9 9 11 11 12 output 9 以人造数据为例. 首先我们让\(i\)\(\to\)\(a_i\) ...