docs: def ndarray_to_imagedatadict(nparr):
      """
      Convert the numpy array nparr into a suitable ImageList entry dictionary.
      Returns a dictionary with the appropriate Data, DataType, PixelDepth
      to be inserted into a dm3 tag dictionary and written to a file.
      """
      ret = {}
      dm_type = None
      for k, v in iter(dm_image_dtypes.items()):
          if v[1] == nparr.dtype.type:
              dm_type = k
              break
      if dm_type is None and nparr.dtype == numpy.uint8 and nparr.shape[-1] in (3, 4):
          ret["DataType"] = 23
          ret["PixelDepth"] = 4
          if nparr.shape[2] == 4:
              rgb_view = nparr.view(numpy.int32).reshape(nparr.shape[:-1])  # squash the color into uint32
          else:
              assert nparr.shape[2] == 3
              rgba_image = numpy.empty(nparr.shape[:-1] + (4,), numpy.uint8)
              rgba_image[:,:,0:3] = nparr
              rgba_image[:,:,3] = 255
              rgb_view = rgba_image.view(numpy.int32).reshape(rgba_image.shape[:-1])  # squash the color into uint32
          ret["Dimensions"] = list(rgb_view.shape[::-1])
          ret["Data"] = parse_dm3.array.array(platform_independent_char(rgb_view.dtype), rgb_view.flatten())
      else:
          ret["DataType"] = dm_type
          ret["PixelDepth"] = nparr.dtype.itemsize
          ret["Dimensions"] = list(nparr.shape[::-1])
          if nparr.dtype.type in np_to_structarray_map:
              types = np_to_structarray_map[nparr.dtype.type]
              ret["Data"] = parse_dm3.structarray(types)
              ret["Data"].raw_data = bytes(numpy.array(nparr, copy=False).data)
          else:
              ret["Data"] = parse_dm3.array.array(platform_independent_char(nparr.dtype), numpy.array(nparr, copy=False).flatten())
      return ret