code: def get_zernike_indexes(limit=10):
      
      def zernike_indexes_iter(n_max):
          for n in range(0, n_max):
              for m in range(n%2, n+1, 2):
                  yield n
                  yield m
  
      z_ind = np.fromiter(zernike_indexes_iter(limit), np.intc)
      z_ind = z_ind.reshape( (len(z_ind) // 2, 2) )
      return z_ind
docs: Return a list of all Zernike indexes up to the given limit
      
      limit - return all Zernike indexes with N less than this limit
      
      returns an array of 2-tuples. Each tuple is organized as (N,M).
      The Zernikes are stored as complex numbers with the real part
      being (N,M) and the imaginary being (N,-M)