class_docstr: A subclass of ndarray that lets you give names to indices.
  
  This is a normal ndarray in the sense that you can always index by numbers and
  slices, though elipses don't work. Also, all elements have the same type,
  unlike a record array.
  
  Names should be a list of names per dimension in the ndarray shape. The names
  should be a list or tuple of strings, a namedtuple class (with names taken
  from _fields), or an IntEnum. Alternatively if you don't want to give a name
  to a particular dimension, use None. If your array only has one dimension, the
  second level of list can be skipped.
  
  Example usage:
    a = named_array.NamedNumpyArray([1, 3, 6], ["a", "b", "c"])
    a.a, a[1], a["c"] => 1, 3, 6
    b = named_array.NamedNumpyArray([[1, 3], [6, 8]], [["a", "b"], None])
    b.a, b[1], b["a", 1] => [1, 3], [6, 8], 3
    c = named_array.NamedNumpyArray([[1, 3], [6, 8]], [None, ["a", "b"]])
    c[0].a, b[1, 0], b[1, "b"] => 1, 6, 8
  Look at the tests for more examples including using enums and named tuples.
docstr: A repr, parsing the original and adding the names param.
docstr_tok: ["A","repr",",","parsing","the","original","and","adding","the","names","param","."]
code: def __repr__(self):
      """A repr, parsing the original and adding the names param."""
      names = []
      for dim_names in self._index_names:
          if dim_names:
              dim_names = [
                  n
                  for n, _ in sorted(
                      dim_names.items(), key=lambda item: item[1]
                  )
              ]
              if len(dim_names) > 11:
                  dim_names = dim_names[:5] + ["..."] + dim_names[-5:]
          names.append(dim_names)
      if len(names) == 1:
          names = names[0]
  
      # "NamedNumpyArray([1, 3, 6], dtype=int32)" ->
      # ["NamedNumpyArray", "[1, 3, 6]", ", dtype=int32"]
      matches = re.findall(
          r"^(\w+)\(([\d\., \n\[\]]*)(,\s+\w+=.+)?\)$",
          np.array_repr(self),
      )[0]
      space = (
          "\n               "
          if matches[2] and matches[2][1] == "\n"
          else ""
      )
      return "%s(%s,%s %s%s)" % (
          matches[0],
          matches[1],
          space,
          names,
          matches[2],
      )
  
imports: import enum
  import numbers
  import re
  import numpy
label_desc: Use image node_id 9 for calling the NamedNumpyArray obj's underlying member method code with example usage: obj.__repr__() and returns: unknown