docs: def czdivide(a, b, null=0):
      '''
      czdivide(a, b) returns the quotient a / b as a numpy array object. Like numpy's divide function
        or a/b syntax, czdivide will thread over the latest dimension possible. Unlike numpy's divide,
        czdivide works with sparse matrices. Additionally, czdivide multiplies a by the zinv of b, so
        divide-by-zero entries are replaced with 0 in the result.
  
      The optional argument null (default: 0) may be given to specify that zeros in the arary b should
      instead be replaced with the given value in the result. Note that if this value is not equal to
      0, then any sparse array passed as argument b must be reified.
  
      The czdivide function never raises an error due to divide-by-zero; if you desire this behavior,
      use the cdivide function instead.
      '''
      if null == 0:         return a.multiply(zinv(b)) if sps.issparse(a) else a * zinv(b)
      elif sps.issparse(b): b = b.toarray()
      else:                 b = np.asarray(b)
      z = np.isclose(b, 0)
      q = np.logical_not(z)
      zi = q / (b + z)
      if sps.issparse(a):
          r = a.multiply(zi).tocsr()
      else:
          r = np.asarray(a) * zi
      r[np.ones(a.shape, dtype=np.bool)*z] = null
      return r