<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _step(self, actions):
 """Takes a step in all environments, shouldn't pre-process or record. Subclasses should override this to do the actual step if something other than the default implementation is desired. Args: actions: (np.ndarray) with first dimension equal to the batch size. Returns: a tuple of stacked raw observations, raw rewards, dones and infos. """


    # Pre-conditions: common_preconditions, see `assert_common_preconditions`.
    #               : len(actions) == len(self._envs)
    self.assert_common_preconditions()
    assert len(actions) == len(self._envs)

    observations = []
    rewards = []
    dones = []
    infos = []

    # Take steps in all environments.
    for env, action in zip(self._envs, actions):
      observation, reward, done, info = env.step(action)

      observations.append(observation)
      rewards.append(reward)
      dones.append(done)
      infos.append(info)

    # Convert each list (observations, rewards, ...) into np.array and return a
    # tuple.
    return tuple(map(np.stack, [observations, rewards, dones, infos]))