class_docstr: Class to represent a sequence of 3d scans (possibly acquired on a
  slice-by-slice basis).
  
  Object remains empty until the data array is actually loaded in memory.
  
  Parameters
  ----------
    data : nd array or proxy (function that actually gets the array)
class_docstr_tok: ["Class","to","represent","a","sequence","of","3d","scans","(","possibly","acquired","on","a","slice-by-slice","basis",")",".","Object","remains","empty","until","the","data","array","is","actually","loaded","in","memory",".","Parameters","--","--","--","--","--","data",":","nd","array","or","proxy","(","function","that","actually","gets","the","array",")"]
code: def get_shape(self):
      if self._shape is None:
          self._load_data()
      return self._shape
  
imports: import os
  import warnings
  import numpy
  from nibabel import io_orientation
  from nibabel.affines import apply_affine
  from ...core.image.image_spaces import as_xyz_image, make_xyz_image, xyz_affine
  from ...io.nibcompat import get_header
  from ..slicetiming import timefuncs
  from ._registration import _cspline_sample3d, _cspline_sample4d, _cspline_transform
  from .affine import Affine, Rigid
  from .optimizer import configure_optimizer, use_derivatives
  from .type_check import check_type, check_type_and_shape
label_desc: Use image node_id 4 for calling the Image4d obj's underlying member method code with example usage: obj.get_shape() and returns: self