code: def ndarray(self):
      # ndarray views are cheap to recreate each time
      if self.use_sip_array:
          if (
              sip.SIP_VERSION >= 0x60708
              and np.__version__
              != "1.22.4"  # TODO: remove me after numpy 1.23+
          ):  # workaround for numpy/sip compatability issue
              # see https://github.com/numpy/numpy/issues/21612
              mv = self._siparray
          else:
              # sip.array prior to SIP_VERSION 6.7.8 had a buggy buffer protocol
              # that set the wrong size.
              # workaround it by going through a sip.voidptr
              mv = sip.voidptr(
                  self._siparray, self._capa * self._nfields * 8
              )
          # note that we perform the slicing by using only _size rows
          nd = np.frombuffer(
              mv, dtype=np.float64, count=self._size * self._nfields
          )
          return nd.reshape((-1, self._nfields))
      else:
          return self._ndarray[: self._size]
  
imports: import ctypes
  import itertools
  import numpy
  from .None import QT_LIB, QtCore, QtGui, compat
label_desc: Use image node_id 5 for calling the PrimitiveArray obj's underlying member method code with example usage: obj.ndarray() and returns: nd, self