class_docstr: Base class for merging a number of OutputData from one or several parent nodes
  into a single InputData for the next level node in the computation graph.
  
  Main method of the interface is `merge` that delegates merge stages to other methods.
  Merge process can be customized for data types by overriding these methods, primarily:
  `merge_targets`, `preprocess_predicts`, `merge_predicts`, `postprocess_predicts'.
  
  :param outputs: list with OutputData from parent nodes for merging
class_docstr_tok: ["Base","class","for","merging","a","number","of","OutputData","from","one","or","several","parent","nodes","into","a","single","InputData","for","the","next","level","node","in","the","computation","graph",".","Main","method","of","the","interface","is","`","merge","`","that","delegates","merge","stages","to","other","methods",".","Merge","process","can","be","customized","for","data","types","by","overriding","these","methods",",","primarily",":","`","merge_targets","`",",","`","preprocess_predicts","`",",","`","merge_predicts","`",",","`","postprocess_predicts","'",".",":","param","outputs",":","list","with","OutputData","from","parent","nodes","for","merging"]
code: def __init__(
      self, outputs: List["OutputData"], data_type: DataTypesEnum = None
  ):
      self.log = default_log(self)
      self.outputs = outputs
      self.data_type = data_type or DataMerger.get_datatype_for_merge(
          output.data_type for output in outputs
      )
  
      # Ensure outputs are of equal length, find common index if it is not
      idx_list = [np.asarray(output.idx) for output in outputs]
      self.common_indices = find_common_elements(*idx_list)
      if len(self.common_indices) == 0:
          raise ValueError("There are no common indices for outputs")
  
      # Find first output with the main target & resulting task
      self.main_output = DataMerger.find_main_output(outputs)
  
imports: from typing import List, Iterable, Union, Optional
  import numpy
  from golem.core.log import default_log
  from golem.utilities.data_structures import are_same_length
  from fedot.core.data.array_utilities import find_common_elements, atleast_2d, atleast_4d, flatten_extra_dim
  from fedot.core.data.data import OutputData, InputData
  from fedot.core.data.merge.supplementary_data_merger import SupplementaryDataMerger
  from fedot.core.repository.dataset_types import DataTypesEnum
label_desc: Use image node_id 1 to create a new DataMerger object  with example: obj = DataMerger(outputs, data_type)