docs: def isel(self, indexers=None, drop=False, **indexers_kwargs):
          """Returns a new dataset with each array indexed along the specified
          dimension(s).
  
          This method selects values from each array using its `__getitem__`
          method, except this method does not require knowing the order of
          each array's dimensions.
  
          Parameters
          ----------
          indexers : dict, optional
              A dict with keys matching dimensions and values given
              by integers, slice objects or arrays.
              indexer can be a integer, slice, array-like or DataArray.
              If DataArrays are passed as indexers, xarray-style indexing will be
              carried out. See :ref:`indexing` for the details.
              One of indexers or indexers_kwargs must be provided.
          drop : bool, optional
              If ``drop=True``, drop coordinates variables indexed by integers
              instead of making them scalar.
          **indexers_kwarg : {dim: indexer, ...}, optional
              The keyword arguments form of ``indexers``.
              One of indexers or indexers_kwargs must be provided.
  
          Returns
          -------
          obj : Dataset
              A new Dataset with the same contents as this dataset, except each
              array and dimension is indexed by the appropriate indexers.
              If indexer DataArrays have coordinates that do not conflict with
              this object, then these coordinates will be attached.
              In general, each array's data will be a view of the array's data
              in this dataset, unless vectorized indexing was triggered by using
              an array indexer, in which case the data will be a copy.
  
          See Also
          --------
          Dataset.sel
          DataArray.isel
          """
  
          indexers = either_dict_or_kwargs(indexers, indexers_kwargs, 'isel')
  
          indexers_list = self._validate_indexers(indexers)
  
          variables = OrderedDict()
          indexes = OrderedDict()
          for name, var in self.variables.items():
              var_indexers = {k: v for k, v in indexers_list if k in var.dims}
              if drop and name in var_indexers:
                  continue  # drop this variable
  
              if name in self.indexes:
                  new_var, new_index = isel_variable_and_index(
                      name, var, self.indexes[name], var_indexers)
                  if new_index is not None:
                      indexes[name] = new_index
              else:
                  new_var = var.isel(indexers=var_indexers)
  
              variables[name] = new_var
  
          coord_names = set(variables).intersection(self._coord_names)
          selected = self._replace_with_new_dims(
              variables, coord_names, indexes)
  
          # Extract coordinates from indexers
          coord_vars, new_indexes = (
              selected._get_indexers_coords_and_indexes(indexers))
          variables.update(coord_vars)
          indexes.update(new_indexes)
          coord_names = (set(variables)
                         .intersection(self._coord_names)
                         .union(coord_vars))
          return self._replace_with_new_dims(
              variables, coord_names, indexes=indexes)