class_docstr: VectorEnv analog to pfrl.wrappers.atari_wrappers.FrameStack.
  
  The original `pfrl.wrappers.atari_wrappers.FrameStack` does not work
  properly with `pfrl.envs.MultiprocessVectorEnv` because LazyFrames
  becomes not lazy when passed between processes, unnecessarily increasing
  memory usage. To avoid the issue, use this wrapper instead of `FrameStack`
  so that LazyFrames are not passed between processes.
  
  Args:
      env (VectorEnv): Env to wrap.
      k (int): How many frames to stack.
      stack_axis (int): Axis along which frames are concatenated.
class_docstr_tok: ["VectorEnv","analog","to","pfrl.wrappers.atari_wrappers.FrameStack",".","The","original","`","pfrl.wrappers.atari_wrappers.FrameStack","`","does","not","work","properly","with","`","pfrl.envs.MultiprocessVectorEnv","`","because","LazyFrames","becomes","not","lazy","when","passed","between","processes",",","unnecessarily","increasing","memory","usage",".","To","avoid","the","issue",",","use","this","wrapper","instead","of","`","FrameStack","`","so","that","LazyFrames","are","not","passed","between","processes",".","Args",":","env","(","VectorEnv",")",":","Env","to","wrap",".","k","(","int",")",":","How","many","frames","to","stack",".","stack_axis","(","int",")",":","Axis","along","which","frames","are","concatenated","."]
code: def step(self, action):
      batch_ob, reward, done, info = self.env.step(action)
      for frames, ob in zip(self.frames, batch_ob):
          frames.append(ob)
      return self._get_ob(), reward, done, info
  
imports: from collections import deque
  import numpy
  from gym import spaces
  from pfrl.env import VectorEnv
  from pfrl.wrappers.atari_wrappers import LazyFrames
label_desc: Use image node_id 3 for calling the VectorFrameStack obj's underlying member method code with example usage: obj.step(action) and returns: self,  reward,  done,  info