docs: def downsample_rand(a, samples, remove_invalid=False, ret_idx=False):
      """Downsampling by randomly removing points
  
      Parameters
      ----------
      a: 1d ndarray
          The input array to downsample
      samples: int
          The desired number of samples
      remove_invalid: bool
          Remove nan and inf values before downsampling
      ret_idx: bool
          Also return a boolean array that corresponds to the
          downsampled indices in `a`.
  
      Returns
      -------
      dsa: 1d ndarray of size `samples`
          The pseudo-randomly downsampled array `a`
      idx: 1d boolean array with same shape as `a`
          Only returned if `ret_idx` is True.
          A boolean array such that `a[idx] == dsa`
      """
      # fixed random state for this method
      rs = np.random.RandomState(seed=47).get_state()
      np.random.set_state(rs)
  
      samples = int(samples)
  
      if remove_invalid:
          # slice out nans and infs
          bad = np.isnan(a) | np.isinf(a)
          pool = a[~bad]
      else:
          pool = a
  
      if samples and (samples < pool.shape[0]):
          keep = np.zeros_like(pool, dtype=bool)
          keep_ids = np.random.choice(np.arange(pool.size),
                                      size=samples,
                                      replace=False)
          keep[keep_ids] = True
          dsa = pool[keep]
      else:
          keep = np.ones_like(pool, dtype=bool)
          dsa = pool
  
      if remove_invalid:
          # translate the kept values back to the original array
          idx = np.zeros(a.size, dtype=bool)
          idx[~bad] = keep
      else:
          idx = keep
  
      if ret_idx:
          return dsa, idx
      else:
          return dsa