docs: def flatter(x, k=1):
      '''
      flatter(x) yields a numpy array equivalent to x but whose first dimension has been flattened.
      flatter(x, k) yields a numpy array whose first k dimensions have been flattened; if k is
        negative, the last k dimensions are flattened. If np.inf or -np.inf is passed, then this is
        equivalent to flattest(x). Note that flatter(x) is equivalent to flatter(x,1).
      flatter(x, 0) yields x.
      '''
      if k == 0: return x
      x = x.toarray() if sps.issparse(x) else np.asarray(x)
      if len(x.shape) - abs(k) < 2: return x.flatten()
      k += np.sign(k)
      if k > 0: return np.reshape(x, (-1,) + x.shape[k:])
      else:     return np.reshape(x, x.shape[:k] + (-1,))