docs: def timescales_from_eigenvalues(evals, tau=1):
      r"""Compute implied time scales from given eigenvalues
  
      Parameters
      ----------
      evals : eigenvalues
      tau : lag time
  
      Returns
      -------
      ts : ndarray
          The implied time scales to the given eigenvalues, in the same order.
  
      """
  
      """Check for dominant eigenvalues with large imaginary part"""
  
      if not np.allclose(evals.imag, 0.0):
          warnings.warn('Using eigenvalues with non-zero imaginary part', ImaginaryEigenValueWarning)
  
      """Check for multiple eigenvalues of magnitude one"""
      ind_abs_one = np.isclose(np.abs(evals), 1.0, rtol=0.0, atol=1e-14)
      if sum(ind_abs_one) > 1:
          warnings.warn('Multiple eigenvalues with magnitude one.', SpectralWarning)
  
      """Compute implied time scales"""
      ts = np.zeros(len(evals))
  
      """Eigenvalues of magnitude one imply infinite timescale"""
      ts[ind_abs_one] = np.inf
  
      """All other eigenvalues give rise to finite timescales"""
      ts[np.logical_not(ind_abs_one)] = \
          -1.0 * tau / np.log(np.abs(evals[np.logical_not(ind_abs_one)]))
      return ts