code: def timescales(T, tau=1, k=None, ncv=None, reversible=False, mu=None):
      r
      if k is None:
          raise ValueError("Number of time scales required for decomposition of sparse matrix")
      values = eigenvalues(T, k=k, ncv=ncv, reversible=reversible)
  
      """Check for dominant eigenvalues with large imaginary part"""
      if not np.allclose(values.imag, 0.0):
          warnings.warn('Using eigenvalues with non-zero imaginary part '
                        'for implied time scale computation', ImaginaryEigenValueWarning)
  
      """Check for multiple eigenvalues of magnitude one"""
      ind_abs_one = np.isclose(np.abs(values), 1.0)
      if sum(ind_abs_one) > 1:
          warnings.warn('Multiple eigenvalues with magnitude one.', SpectralWarning)
  
      """Compute implied time scales"""
      ts = np.zeros(len(values))
  
      """Eigenvalues of magnitude one imply infinite rate"""
      ts[ind_abs_one] = np.inf
  
      """All other eigenvalues give rise to finite rates"""
      ts[np.logical_not(ind_abs_one)] = \
          -1.0 * tau / np.log(np.abs(values[np.logical_not(ind_abs_one)]))
      return ts
docs: r"""Compute implied time scales of given transition matrix
  
      Parameters
      ----------
      T : transition matrix
      tau : lag time
      k : int (optional)
          Compute the first k implied time scales.
      ncv : int (optional)
          The number of Lanczos vectors generated, `ncv` must be greater than k;
          it is recommended that ncv > 2*k
      reversible : bool, optional
          Indicate that transition matrix is reversible
      mu : (M,) ndarray, optional
          Stationary distribution of T
  
      Returns
      -------
      ts : ndarray
          The implied time scales of the transition matrix.