class_docstr: Concatenate inner features of sub data containers along `axis=-1`..
  
  Code example:
  
  .. code-block:: python
  
      data_container = DataContainer(data_inputs=data_inputs_3d, expected_outputs=expected_outputs_3d)
      data_container.add_sub_data_container(name='1d_data_source', data_container=data_container_1d)
      data_container.add_sub_data_container(name='2d_data_source', data_container=data_container_2d)
  
      # data container with sub data containers :
      # DataContainer(data_inputs=data_inputs_3d, expected_outputs=expected_outputs, sub_data_containers=[('1d_data_source', data_container_1d), ('2d_data_source', data_container_2d)])
  
      p = Pipeline([
          InnerConcatenateDataContainer()
          # is equivalent to ZipData(sub_data_container_names=['1d_data_source', '2d_data_source'])
      ])
  
      data_container = p.handle_transform(data_container, ExecutionContext())
  
      # new_shape: (batch_size, time_steps, n_features + batch_features + 1)
  
  
  .. seealso::
      :class:`~neuraxle.base.NonTransformableMixin`,
      :class:`~neuraxle.base.BaseStep`
      :class:`~neuraxle.data_container.DataContainer`
class_docstr_tok: ["Concatenate","inner","features","of","sub","data","containers","along","`","axis=-1","`","..","Code","example",":","..","code-block",":",":","python","data_container","=","DataContainer","(","data_inputs=data_inputs_3d",",","expected_outputs=expected_outputs_3d",")","data_container.add_sub_data_container","(","name='1d_data_source","'",",","data_container=data_container_1d",")","data_container.add_sub_data_container","(","name='2d_data_source","'",",","data_container=data_container_2d",")","#","data","container","with","sub","data","containers",":","#","DataContainer","(","data_inputs=data_inputs_3d",",","expected_outputs=expected_outputs",",","sub_data_containers=","[","(","'1d_data_source","'",",","data_container_1d",")",",","(","'2d_data_source","'",",","data_container_2d",")","]",")","p","=","Pipeline","(","[","InnerConcatenateDataContainer","(",")","#","is","equivalent","to","ZipData","(","sub_data_container_names=","[","'1d_data_source","'",",","'2d_data_source","'","]",")","]",")","data_container","=","p.handle_transform","(","data_container",",","ExecutionContext","(",")",")","#","new_shape",":","(","batch_size",",","time_steps",",","n_features","+","batch_features","+","1",")","..","seealso",":",":",":","class",":","`","~neuraxle.base.NonTransformableMixin","`",",",":","class",":","`","~neuraxle.base.BaseStep","`",":","class",":","`","~neuraxle.data_container.DataContainer","`"]
docstr: Merge sub data containers into the current data container.
  
  :param data_container: data container to zip
  :type data_container: DataContainer
  :param context: execution context
  :type context: ExecutionContext
  :return: base step, data container
  :rtype: DataContainer
docstr_tok: ["Merge","sub","data","containers","into","the","current","data","container",".",":","param","data_container",":","data","container","to","zip",":","type","data_container",":","DataContainer",":","param","context",":","execution","context",":","type","context",":","ExecutionContext",":","return",":","base","step",",","data","container",":","rtype",":","DataContainer"]
code: def _transform_data_container(
      self, data_container: DACT, context: CX
  ) -> DACT:
      """
      Merge sub data containers into the current data container.
  
      :param data_container: data container to zip
      :type data_container: DataContainer
      :param context: execution context
      :type context: ExecutionContext
      :return: base step, data container
      :rtype: DataContainer
      """
      return self._concatenate_sub_data_containers(data_container)
  
imports: import random
  from operator import attrgetter
  from typing import Iterable, List, Tuple
  from neuraxle.base import BaseStep, BaseTransformer
  from neuraxle.base import ExecutionContext
  from neuraxle.base import ForceHandleOnlyMixin, MetaStep
  from neuraxle.data_container import DACT, _inner_concatenate_np_array
  from neuraxle.pipeline import Pipeline
  from neuraxle.steps.flow import TrainOnlyWrapper
  from neuraxle.steps.output_handlers import IdsAndInputAndOutputTransformerMixin
label_desc: Use image node_id 3 for calling the InnerConcatenateDataContainer obj's underlying member method code with example usage: obj._transform_data_container(data_container, context) and returns: self