code: def dogeo_V(indat):
      
      indat = indat.transpose()
      # unpack input array into separate arrays
      dec, inc, az, pl = indat[0], indat[1], indat[2], indat[3]
      Dir = np.array([dec, inc]).transpose()
      X = dir2cart(Dir).transpose()  # get cartesian coordinates
      N = np.size(dec)
      A1 = dir2cart(np.array([az, pl, np.ones(N)]).transpose()).transpose()
      A2 = dir2cart(
          np.array([az + 90., np.zeros(N), np.ones(N)]).transpose()).transpose()
      A3 = dir2cart(
          np.array([az - 180., 90. - pl, np.ones(N)]).transpose()).transpose()
  
  # do rotation
  #
      xp = A1[0] * X[0] + A2[0] * X[1] + A3[0] * X[2]
      yp = A1[1] * X[0] + A2[1] * X[1] + A3[1] * X[2]
      zp = A1[2] * X[0] + A2[2] * X[1] + A3[2] * X[2]
      cart = np.array([xp, yp, zp]).transpose()
  #
  # transform back to dec,inc
  #
      Dir_geo = cart2dir(cart).transpose()
      # send back declination and inclination arrays
      return Dir_geo[0], Dir_geo[1]
docs: Rotates declination and inclination into geographic coordinates using the
      azimuth and plunge of the X direction (lab arrow) of a specimen.
  
      Parameters
      ----------
      indat: nested list of [dec, inc, az, pl] data
  
      Returns
      -------
      rotated_directions : arrays of Declinations and Inclinations