class_docstr: This class receives an iterable of DataContainer and zips their feature together.
  If concatenate_inner_features is True, then features are concatenated after being zipped.
class_docstr_tok: ["This","class","receives","an","iterable","of","DataContainer","and","zips","their","feature","together",".","If","concatenate_inner_features","is","True",",","then","features","are","concatenated","after","being","zipped","."]
code: def _transform_data_container(
      self, data_container: DACT, context: CX
  ) -> DACT:
      if any(
          not isinstance(di, DACT) for di in data_container.data_inputs
      ):
          raise ValueError(
              "data_inputs given to ZipFeatures must be a list of DataContainer instances"
          )
      data_container = ZipDataContainer.create_from(
          *data_container.data_inputs
      )
      if self.concatenate_inner_features:
          data_container.concatenate_inner_features()
      return data_container
  
imports: from typing import Tuple
  from joblib import Parallel, delayed
  from neuraxle.base import CX, DACT, BaseStep, BaseTransformer, ForceHandleOnlyMixin, Identity, NamedStepsList, NonFittableMixin, TruncableSteps, _TruncableServiceWithBodyMixin
  from neuraxle.data_container import ZipDataContainer
  from neuraxle.steps.numpy import NumpyConcatenateInnerFeatures
label_desc: Use image node_id 3 for calling the ZipFeatures obj's underlying member method code with example usage: obj._transform_data_container(data_container, context) and returns: data_container