class_docstr: Abstract base class that stores data as well as any extra metadata.
  
  This allows for subclassing `torch.Tensor` and `np.ndarray` through multiple inheritance.
  
  Metadata is stored in the form of a dictionary.
  
  Behavior should be the same as extended class (e.g., `torch.Tensor` or `np.ndarray`)
  aside from the extended meta functionality.
  
  Copying of information:
  
      * For `c = a + b`, then auxiliary data (e.g., metadata) will be copied from the
        first instance of `MetaObj` if `a.is_batch` is False
        (For batched data, the metadata will be shallow copied for efficiency purposes).
docstr: Copy metadata from a `MetaObj` or an iterable of `MetaObj` instances.
  
  Args:
      input_objs: list of `MetaObj` to copy data from.
      copy_attr: whether to copy each attribute with `MetaObj.copy_item`.
          note that if the attribute is a nested list or dict, only a shallow copy will be done.
      keys: the keys of attributes to copy from the ``input_objs``.
          If None, all keys from the input_objs will be copied.
docstr_tok: ["Copy","metadata","from","a","`","MetaObj","`","or","an","iterable","of","`","MetaObj","`","instances",".","Args",":","input_objs",":","list","of","`","MetaObj","`","to","copy","data","from",".","copy_attr",":","whether","to","copy","each","attribute","with","`","MetaObj.copy_item","`",".","note","that","if","the","attribute","is","a","nested","list","or","dict",",","only","a","shallow","copy","will","be","done",".","keys",":","the","keys","of","attributes","to","copy","from","the","``","input_objs","``",".","If","None",",","all","keys","from","the","input_objs","will","be","copied","."]
code: def copy_meta_from(self, input_objs, copy_attr=True, keys=None):
      """
      Copy metadata from a `MetaObj` or an iterable of `MetaObj` instances.
  
      Args:
          input_objs: list of `MetaObj` to copy data from.
          copy_attr: whether to copy each attribute with `MetaObj.copy_item`.
              note that if the attribute is a nested list or dict, only a shallow copy will be done.
          keys: the keys of attributes to copy from the ``input_objs``.
              If None, all keys from the input_objs will be copied.
      """
      first_meta = (
          input_objs
          if isinstance(input_objs, MetaObj)
          else first(input_objs, default=self)
      )
      if not hasattr(first_meta, "__dict__"):
          return self
      first_meta = first_meta.__dict__
      keys = first_meta.keys() if keys is None else keys
      if not copy_attr:
          self.__dict__ = {
              a: first_meta[a] for a in keys if a in first_meta
          }  # shallow copy for performance
      else:
          self.__dict__.update(
              {
                  a: MetaObj.copy_items(first_meta[a])
                  for a in keys
                  if a in first_meta
              }
          )
      return self
  
imports: from __future__ import annotations
  import itertools
  import pprint
  from copy import deepcopy
  from typing import Any, Iterable
  import numpy
  import torch
  from monai.utils import TraceKeys, first, is_immutable
label_desc: Use image node_id 4 for calling the MetaObj obj's underlying member method code with example usage: obj.copy_meta_from(input_objs, copy_attr, keys) and returns: self, self