docs: def encode_complex(data, complex_names):
      """ Encodes complex data to having arbitrary complex field names.
  
      Encodes complex `data` to have the real and imaginary field names
      given in `complex_numbers`. This is needed because the field names
      have to be set so that it can be written to an HDF5 file with the
      right field names (HDF5 doesn't have a native complex type, so
      H5T_COMPOUND have to be used).
  
      Parameters
      ----------
      data : arraylike
          The data to encode as a complex type with the desired real and
          imaginary part field names.
      complex_names : tuple of 2 str
          ``tuple`` of the names to use (in order) for the real and
          imaginary fields.
  
      Returns
      -------
      d : encoded data
          `data` encoded into having the specified field names for the
          real and imaginary parts.
  
      See Also
      --------
      decode_complex
  
      """
      # Grab the dtype name, and convert it to the right non-complex type
      # if it isn't already one.
      dtype_name = data.dtype.name
      if dtype_name[0:7] == 'complex':
          dtype_name = 'float' + str(int(float(dtype_name[7:])/2))
  
      # Create the new version of the data with the right field names for
      # the real and complex parts. This is easy to do with putting the
      # right detype in the view function.
      dt = np.dtype([(complex_names[0], dtype_name),
                     (complex_names[1], dtype_name)])
      return data.view(dt).copy()