class_docstr: Stationary Stochastic Bandit environment with per-arm features.
class_docstr_tok: ["Stationary","Stochastic","Bandit","environment","with","per-arm","features","."]
code: def _choose_items_ghost_actions(self, global_obs, slotted_items):
      # If one of the unit vectors gets chosen, it means no-click.
      slotted_items_with_units = np.concatenate(
          [
              slotted_items,
              np.broadcast_to(
                  np.identity(self._item_dim),
                  [self._batch_size, self._item_dim, self._item_dim],
              ),
          ],
          axis=1,
      )
  
      scores = self._batched_inner_product(
          global_obs, slotted_items_with_units
      )
      perturbed_scores = np.random.normal(loc=scores, scale=1)
      unnormalized_probabilities = 1 / (1 + np.exp(-perturbed_scores))
      probabilities = unnormalized_probabilities / np.expand_dims(
          np.linalg.norm(unnormalized_probabilities, ord=1, axis=-1),
          axis=1,
      )
  
      return np.minimum(
          [
              np.random.choice(
                  np.arange(self._num_slots + self._item_dim), p=p
              )
              for p in probabilities
          ],
          self._num_slots,
      )
  
imports: from typing import Callable, Optional, Sequence, Text
  import numpy
  import tensorflow
  from tf_agents.bandits.environments import bandit_py_environment
  from tf_agents.bandits.specs import utils
  from tf_agents.specs import array_spec
  from tf_agents.trajectories import time_step
  from tf_agents.typing import types
label_desc: Use image node_id 9 for calling the RankingPyEnvironment obj's underlying member method code with example usage: obj._choose_items_ghost_actions(global_obs, slotted_items) and returns: np