觀察包裝器

class gymnasium.ObservationWrapper(env: Env[ObsType, ActType])[source]

使用 observation() 函式修改來自 Env.reset()Env.step() 的觀察。

如果你想在將觀察傳遞給學習程式碼之前只對觀察應用一個函式,你可以簡單地繼承 ObservationWrapper 並重寫 observation() 方法來實現該轉換。該方法中定義的轉換必須與 env 觀察空間相符。否則,你需要在包裝器的 __init__() 方法中透過設定 self.observation_space 來指定包裝器的新觀察空間。

引數:

env – 要被包裝的環境。

observation(observation: ObsType) WrapperObsType[source]

返回一個修改後的觀察。

引數:

observationenv 的觀察

返回:

修改後的觀察

已實現的包裝器

class gymnasium.wrappers.TransformObservation(env: Env[ObsType, ActType], func: Callable[[ObsType], Any], observation_space: Space[WrapperObsType] | None)[source]

對從環境的 Env.reset()Env.step() 接收到的 observation 應用一個函式,並將其返回給使用者。

函式 func 將應用於所有觀察。如果 func 的觀察超出了 env 的觀察空間的邊界,請提供更新的 observation_space

此包裝器的向量版本存在於 gymnasium.wrappers.vector.TransformObservation

示例

>>> import gymnasium as gym
>>> from gymnasium.wrappers import TransformObservation
>>> import numpy as np
>>> np.random.seed(0)
>>> env = gym.make("CartPole-v1")
>>> env.reset(seed=42)
(array([ 0.0273956 , -0.00611216,  0.03585979,  0.0197368 ], dtype=float32), {})
>>> env = gym.make("CartPole-v1")
>>> env = TransformObservation(env, lambda obs: obs + 0.1 * np.random.random(obs.shape), env.observation_space)
>>> env.reset(seed=42)
(array([0.08227695, 0.06540678, 0.09613613, 0.07422512]), {})
更改日誌
  • v0.15.4 - 初次新增

  • v1.0.0 - 新增 observation_space 的要求

引數:
  • env – 要包裝的環境

  • func – 將轉換觀察的函式。如果此轉換後的觀察超出了 env.observation_space 的觀察空間,則提供一個 observation_space

  • observation_space – 包裝器的觀察空間,如果為 None,則假定與 env.observation_space 相同。

class gymnasium.wrappers.DelayObservation(env: Env[ObsType, ActType], delay: int)[source]

為環境返回的觀察新增延遲。

在達到 delay 個時間步之前,返回的觀察是與觀察空間形狀相同的零陣列。

此包裝器沒有向量版本。

注意

這不支援隨機延遲值,如果使用者對此感興趣,請提出問題或拉取請求以新增此功能。

示例

>>> import gymnasium as gym
>>> env = gym.make("CartPole-v1")
>>> env.reset(seed=123)
(array([ 0.01823519, -0.0446179 , -0.02796401, -0.03156282], dtype=float32), {})
>>> env = DelayObservation(env, delay=2)
>>> env.reset(seed=123)
(array([0., 0., 0., 0.], dtype=float32), {})
>>> env.step(env.action_space.sample())
(array([0., 0., 0., 0.], dtype=float32), 1.0, False, False, {})
>>> env.step(env.action_space.sample())
(array([ 0.01823519, -0.0446179 , -0.02796401, -0.03156282], dtype=float32), 1.0, False, False, {})
更改日誌
  • v1.0.0 - 初次新增

引數:
  • env – 要包裝的環境

  • delay – 延遲觀察的時間步數

class gymnasium.wrappers.DtypeObservation(env: Env[ObsType, ActType], dtype: Any)[source]

將觀察陣列的資料型別修改為指定的資料型別。

注意

這僅與 BoxDiscreteMultiDiscreteMultiBinary 觀察空間相容。

此包裝器的向量版本存在於 gymnasium.wrappers.vector.DtypeObservation

更改日誌
  • v1.0.0 - 初次新增

引數:
  • env – 要包裝的環境

  • dtype – 觀察的新資料型別

class gymnasium.wrappers.FilterObservation(env: Env[ObsType, ActType], filter_keys: Sequence[str | int])[source]

根據一組鍵或索引過濾 Dict 或 Tuple 觀察空間。

此包裝器的向量版本存在於 gymnasium.wrappers.vector.FilterObservation

示例

>>> import gymnasium as gym
>>> from gymnasium.wrappers import FilterObservation
>>> env = gym.make("CartPole-v1")
>>> env = gym.wrappers.TimeAwareObservation(env, flatten=False)
>>> env.observation_space
Dict('obs': Box([-4.8               -inf -0.41887903        -inf], [4.8               inf 0.41887903        inf], (4,), float32), 'time': Box(0, 500, (1,), int32))
>>> env.reset(seed=42)
({'obs': array([ 0.0273956 , -0.00611216,  0.03585979,  0.0197368 ], dtype=float32), 'time': array([0], dtype=int32)}, {})
>>> env = FilterObservation(env, filter_keys=['time'])
>>> env.reset(seed=42)
({'time': array([0], dtype=int32)}, {})
>>> env.step(0)
({'time': array([1], dtype=int32)}, 1.0, False, False, {})
更改日誌
  • v0.12.3 - 初次新增,原名 FilterObservationWrapper

  • v1.0.0 - 重新命名為 FilterObservation 並新增對帶有整數 filter_keys 的元組觀察空間的支援。

引數:
  • env – 要包裝的環境

  • filter_keys – 要“包含”的子空間集合,對於 Dict 空間使用字串列表,對於 Tuple 空間使用整數。

class gymnasium.wrappers.FlattenObservation(env: Env[ObsType, ActType])[source]

展平環境的觀察空間以及來自 resetstep 函式的每個觀察。

此包裝器的向量版本存在於 gymnasium.wrappers.vector.FlattenObservation

示例

>>> import gymnasium as gym
>>> from gymnasium.wrappers import FlattenObservation
>>> env = gym.make("CarRacing-v3")
>>> env.observation_space.shape
(96, 96, 3)
>>> env = FlattenObservation(env)
>>> env.observation_space.shape
(27648,)
>>> obs, _ = env.reset()
>>> obs.shape
(27648,)
更改日誌
  • v0.15.0 - 初次新增

引數:

env – 要包裝的環境

class gymnasium.wrappers.FrameStackObservation(env: Env[ObsType, ActType], stack_size: int, *, padding_type: str | ObsType = 'reset')[source]

以滾動方式堆疊過去 N 個時間步的觀察。

例如,如果堆疊數為 4,則返回的觀察包含最近的 4 個觀察。對於環境“Pendulum-v1”,原始觀察是一個形狀為 [3] 的陣列,如果我們堆疊 4 個觀察,則處理後的觀察形狀為 [4, 3]。

使用者可以選擇用於填充的觀察值。

  • “reset”(預設) - 重置值重複。

  • “zero” - 觀察空間的“零”例項。

  • 自定義 - 觀察空間的一個例項。

此包裝器沒有向量版本。

示例

>>> import gymnasium as gym
>>> from gymnasium.wrappers import FrameStackObservation
>>> env = gym.make("CarRacing-v3")
>>> env = FrameStackObservation(env, stack_size=4)
>>> env.observation_space
Box(0, 255, (4, 96, 96, 3), uint8)
>>> obs, _ = env.reset()
>>> obs.shape
(4, 96, 96, 3)
使用不同填充觀察的示例
>>> env = gym.make("CartPole-v1")
>>> env.reset(seed=123)
(array([ 0.01823519, -0.0446179 , -0.02796401, -0.03156282], dtype=float32), {})
>>> stacked_env = FrameStackObservation(env, 3)   # the default is padding_type="reset"
>>> stacked_env.reset(seed=123)
(array([[ 0.01823519, -0.0446179 , -0.02796401, -0.03156282],
       [ 0.01823519, -0.0446179 , -0.02796401, -0.03156282],
       [ 0.01823519, -0.0446179 , -0.02796401, -0.03156282]],
      dtype=float32), {})
>>> stacked_env = FrameStackObservation(env, 3, padding_type="zero")
>>> stacked_env.reset(seed=123)
(array([[ 0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.01823519, -0.0446179 , -0.02796401, -0.03156282]],
      dtype=float32), {})
>>> stacked_env = FrameStackObservation(env, 3, padding_type=np.array([1, -1, 0, 2], dtype=np.float32))
>>> stacked_env.reset(seed=123)
(array([[ 1.        , -1.        ,  0.        ,  2.        ],
       [ 1.        , -1.        ,  0.        ,  2.        ],
       [ 0.01823519, -0.0446179 , -0.02796401, -0.03156282]],
      dtype=float32), {})
更改日誌
  • v0.15.0 - 初次新增為 FrameStack,支援 lz4。

  • v1.0.0 - 重新命名為 FrameStackObservation,並移除 lz4 和 LazyFrame 支援,

    同時新增 padding_type 引數。

引數:
  • env – 要應用包裝器的環境

  • stack_size – 要堆疊的幀數。

  • padding_type – 堆疊觀察時使用的填充型別,選項:“reset”、“zero”、自定義觀察。

class gymnasium.wrappers.GrayscaleObservation(env: Env[ObsType, ActType], keep_dim: bool = False)[source]

將由 resetstep 計算的影像觀察從 RGB 轉換為灰度。

keep_dim 將保留通道維度。

此包裝器的向量版本存在於 gymnasium.wrappers.vector.GrayscaleObservation

示例

>>> import gymnasium as gym
>>> from gymnasium.wrappers import GrayscaleObservation
>>> env = gym.make("CarRacing-v3")
>>> env.observation_space.shape
(96, 96, 3)
>>> grayscale_env = GrayscaleObservation(env)
>>> grayscale_env.observation_space.shape
(96, 96)
>>> grayscale_env = GrayscaleObservation(env, keep_dim=True)
>>> grayscale_env.observation_space.shape
(96, 96, 1)
更改日誌
  • v0.15.0 - 初次新增,原名 GrayScaleObservation

  • v1.0.0 - 重新命名為 GrayscaleObservation

引數:
  • env – 要包裝的環境

  • keep_dim – 是否在觀察中保留通道,如果為 True,則 obs.shape == 3,否則 obs.shape == 2

class gymnasium.wrappers.MaxAndSkipObservation(env: Env[ObsType, ActType], skip: int = 4)[source]

跳過第 N 幀(觀察)並返回最後兩個觀察之間的最大值。

此包裝器沒有向量版本。

示例

>>> import gymnasium as gym
>>> env = gym.make("CartPole-v1")
>>> obs0, *_ = env.reset(seed=123)
>>> obs1, *_ = env.step(1)
>>> obs2, *_ = env.step(1)
>>> obs3, *_ = env.step(1)
>>> obs4, *_ = env.step(1)
>>> skip_and_max_obs = np.max(np.stack([obs3, obs4], axis=0), axis=0)
>>> env = gym.make("CartPole-v1")
>>> wrapped_env = MaxAndSkipObservation(env)
>>> wrapped_obs0, *_ = wrapped_env.reset(seed=123)
>>> wrapped_obs1, *_ = wrapped_env.step(1)
>>> np.all(obs0 == wrapped_obs0)
np.True_
>>> np.all(wrapped_obs1 == skip_and_max_obs)
np.True_
更改日誌
  • v1.0.0 - 初次新增

引數:
  • env (Env) – 要應用包裝器的環境

  • skip – 要跳過的幀數

class gymnasium.wrappers.NormalizeObservation(env: Env[ObsType, ActType], epsilon: float = 1e-8)[source]

將觀察歸一化,使其以均值為中心,並具有單位方差。

屬性 update_running_mean 允許凍結/繼續觀察統計量的執行均值計算。如果為 True(預設),則每次呼叫 stepreset 時,RunningMeanStd 都將更新。如果為 False,則使用計算出的統計量,但不再更新;這可以在評估期間使用。

此包裝器的向量版本存在於 gymnasium.wrappers.vector.NormalizeObservation

注意

歸一化取決於過去的軌跡,如果包裝器是新例項化的或策略最近已更改,則觀察將不會正確歸一化。

示例

>>> import numpy as np
>>> import gymnasium as gym
>>> env = gym.make("CartPole-v1")
>>> obs, info = env.reset(seed=123)
>>> term, trunc = False, False
>>> while not (term or trunc):
...     obs, _, term, trunc, _ = env.step(1)
...
>>> obs
array([ 0.1511158 ,  1.7183299 , -0.25533703, -2.8914354 ], dtype=float32)
>>> env = gym.make("CartPole-v1")
>>> env = NormalizeObservation(env)
>>> obs, info = env.reset(seed=123)
>>> term, trunc = False, False
>>> while not (term or trunc):
...     obs, _, term, trunc, _ = env.step(1)
>>> obs
array([ 2.0059888,  1.5676788, -1.9944268, -1.6120394], dtype=float32)
更改日誌
  • v0.21.0 - 初次新增

  • v1.0.0 - 新增 update_running_mean 屬性以允許停用執行均值/標準差的更新,這在評估時特別有用。

    將所有觀察轉換為 np.float32,並將觀察空間的低/高值設定為 -np.infnp.inf,資料型別設定為 np.float32

引數:
  • env (Env) – 要應用包裝器的環境

  • epsilon – 用於縮放觀察的穩定性引數。

class gymnasium.wrappers.AddRenderObservation(env: Env[ObsType, ActType], render_only: bool = True, render_key: str = 'pixels', obs_key: str = 'state')[source]

將渲染的觀察包含在環境的觀察中。

注意

此包裝器以前稱為 PixelObservationWrapper

此包裝器沒有向量版本。

示例 - 用渲染影像替換觀察
>>> env = gym.make("CartPole-v1", render_mode="rgb_array")
>>> env = AddRenderObservation(env, render_only=True)
>>> env.observation_space
Box(0, 255, (400, 600, 3), uint8)
>>> obs, _ = env.reset(seed=123)
>>> image = env.render()
>>> np.all(obs == image)
np.True_
>>> obs, *_ = env.step(env.action_space.sample())
>>> image = env.render()
>>> np.all(obs == image)
np.True_
示例 - 將渲染影像作為字典項新增到原始觀察中
>>> env = gym.make("CartPole-v1", render_mode="rgb_array")
>>> env = AddRenderObservation(env, render_only=False)
>>> env.observation_space
Dict('pixels': Box(0, 255, (400, 600, 3), uint8), 'state': Box([-4.8               -inf -0.41887903        -inf], [4.8               inf 0.41887903        inf], (4,), float32))
>>> obs, info = env.reset(seed=123)
>>> obs.keys()
dict_keys(['state', 'pixels'])
>>> obs["state"]
array([ 0.01823519, -0.0446179 , -0.02796401, -0.03156282], dtype=float32)
>>> np.all(obs["pixels"] == env.render())
np.True_
>>> obs, reward, terminates, truncates, info = env.step(env.action_space.sample())
>>> image = env.render()
>>> np.all(obs["pixels"] == image)
np.True_
更改日誌
  • v0.15.0 - 初次新增為 PixelObservationWrapper

  • v1.0.0 - 重新命名為 AddRenderObservation

引數:
  • env – 要包裝的環境。

  • render_only (bool) – 如果為 True(預設),則將丟棄包裝環境返回的原始觀察,並且字典觀察將僅包含畫素。如果為 False,則觀察字典將同時包含原始觀察和畫素觀察。

  • render_key – 可選的自定義字串,指定畫素鍵。預設為“pixels”。

  • obs_key – 可選的自定義字串,指定觀察鍵。預設為“state”。

class gymnasium.wrappers.ResizeObservation(env: Env[ObsType, ActType], shape: tuple[int, int])[source]

使用 OpenCV 將影像觀察調整為指定形狀。

此包裝器的向量版本存在於 gymnasium.wrappers.vector.ResizeObservation

示例

>>> import gymnasium as gym
>>> from gymnasium.wrappers import ResizeObservation
>>> env = gym.make("CarRacing-v3")
>>> env.observation_space.shape
(96, 96, 3)
>>> resized_env = ResizeObservation(env, (32, 32))
>>> resized_env.observation_space.shape
(32, 32, 3)
更改日誌
  • v0.12.6 - 初次新增

  • v1.0.0 - 要求 shape 為包含兩個整數的元組。

引數:
  • env – 要包裝的環境

  • shape – 調整後的觀察形狀

class gymnasium.wrappers.ReshapeObservation(env: Env[ObsType, ActType], shape: int | tuple[int, ...])[source]

將基於陣列的觀察重塑為指定形狀。

此包裝器的向量版本存在於 gymnasium.wrappers.vector.RescaleObservation

示例

>>> import gymnasium as gym
>>> from gymnasium.wrappers import ReshapeObservation
>>> env = gym.make("CarRacing-v3")
>>> env.observation_space.shape
(96, 96, 3)
>>> reshape_env = ReshapeObservation(env, (24, 4, 96, 1, 3))
>>> reshape_env.observation_space.shape
(24, 4, 96, 1, 3)
更改日誌
  • v1.0.0 - 初次新增

引數:
  • env – 要包裝的環境

  • shape – 重塑後的觀察空間

class gymnasium.wrappers.RescaleObservation(env: Env[ObsType, ActType], min_obs: floating | integer | ndarray, max_obs: floating | integer | ndarray)[source]

將環境的 Box 觀察空間進行仿射(線性)重新縮放,使其範圍在 [min_obs, max_obs] 之間。

對於原始觀察空間中無界的元件,相應的目標邊界也必須是無限的,反之亦然。

此包裝器的向量版本存在於 gymnasium.wrappers.vector.RescaleObservation

示例

>>> import gymnasium as gym
>>> from gymnasium.wrappers import RescaleObservation
>>> env = gym.make("Pendulum-v1")
>>> env.observation_space
Box([-1. -1. -8.], [1. 1. 8.], (3,), float32)
>>> env = RescaleObservation(env, np.array([-2, -1, -10], dtype=np.float32), np.array([1, 0, 1], dtype=np.float32))
>>> env.observation_space
Box([ -2.  -1. -10.], [1. 0. 1.], (3,), float32)
更改日誌
  • v1.0.0 - 初次新增

引數:
  • env – 要包裝的環境

  • min_obs – 新的最小觀察邊界

  • max_obs – 新的最大觀察邊界

class gymnasium.wrappers.TimeAwareObservation(env: Env[ObsType, ActType], flatten: bool = True, normalize_time: bool = False, *, dict_time_key: str = 'time')[source]

用一個情節中經過的時間步數來擴充觀察。

normalize_time 引數如果為 True,則將時間表示為 [0,1] 之間的歸一化值,否則如果為 False,則當前時間步是一個整數。

對於具有 Dict 觀察空間的環境,時間資訊會自動新增到鍵 “time” 中(可透過 dict_time_key 更改),對於具有 Tuple 觀察空間的環境,時間資訊作為元組的最後一個元素新增。否則,觀察空間將轉換為一個 Dict 觀察空間,其中包含兩個鍵:“obs”用於基本環境的觀察,“time”用於時間資訊。

要展平觀察,請使用 flatten 引數,它將使用 gymnasium.spaces.utils.flatten() 函式。

此包裝器沒有向量版本。

示例

>>> import gymnasium as gym
>>> from gymnasium.wrappers import TimeAwareObservation
>>> env = gym.make("CartPole-v1")
>>> env = TimeAwareObservation(env)
>>> env.observation_space
Box([-4.80000019        -inf -0.41887903        -inf  0.        ], [4.80000019e+00            inf 4.18879032e-01            inf
 5.00000000e+02], (5,), float64)
>>> env.reset(seed=42)[0]
array([ 0.0273956 , -0.00611216,  0.03585979,  0.0197368 ,  0.        ])
>>> _ = env.action_space.seed(42)
>>> env.step(env.action_space.sample())[0]
array([ 0.02727336, -0.20172954,  0.03625453,  0.32351476,  1.        ])
歸一化時間觀察空間示例
>>> env = gym.make('CartPole-v1')
>>> env = TimeAwareObservation(env, normalize_time=True)
>>> env.observation_space
Box([-4.8               -inf -0.41887903        -inf  0.        ], [4.8               inf 0.41887903        inf 1.        ], (5,), float32)
>>> env.reset(seed=42)[0]
array([ 0.0273956 , -0.00611216,  0.03585979,  0.0197368 ,  0.        ],
      dtype=float32)
>>> _ = env.action_space.seed(42)
>>> env.step(env.action_space.sample())[0]
array([ 0.02727336, -0.20172954,  0.03625453,  0.32351476,  0.002     ],
      dtype=float32)
展平觀察空間示例
>>> env = gym.make("CartPole-v1")
>>> env = TimeAwareObservation(env, flatten=False)
>>> env.observation_space
Dict('obs': Box([-4.8               -inf -0.41887903        -inf], [4.8               inf 0.41887903        inf], (4,), float32), 'time': Box(0, 500, (1,), int32))
>>> env.reset(seed=42)[0]
{'obs': array([ 0.0273956 , -0.00611216,  0.03585979,  0.0197368 ], dtype=float32), 'time': array([0], dtype=int32)}
>>> _ = env.action_space.seed(42)
>>> env.step(env.action_space.sample())[0]
{'obs': array([ 0.02727336, -0.20172954,  0.03625453,  0.32351476], dtype=float32), 'time': array([1], dtype=int32)}
更改日誌
  • v0.18.0 - 初次新增

  • v1.0.0 - 移除向量環境支援,新增 flattennormalize_time 引數。

引數:
  • env – 要應用包裝器的環境

  • flatten – 將觀察展平為單個維度的 Box

  • normalize_time – 如果為 True,則返回範圍在 [0,1] 之間的時間;否則,返回時間為截斷前剩餘的時間步數。

  • dict_time_key – 對於具有 Dict 觀察空間的環境,時間空間的鍵。預設為“time”。