code: def query(self, query, k):
      timer = utils.Timer(
          f"Finding {k} nearest neighbors in existing embedding using Annoy "
          f"approximate search...",
          self.verbose,
      )
      timer.__enter__()
  
      N = query.shape[0]
      distances = np.zeros((N, k))
      indices = np.zeros((N, k)).astype(int)
  
      def getnns(i):
          indices[i], distances[i] = self.index.get_nns_by_vector(
              query[i], k, include_distances=True
          )
  
      if self.n_jobs == 1:
          for i in range(N):
              getnns(i)
      else:
          from joblib import Parallel, delayed
  
          Parallel(n_jobs=self.n_jobs, require="sharedmem")(
              delayed(getnns)(i) for i in range(N)
          )
  
      timer.__exit__()
  
      return indices, distances
  
imports: import logging
  import os
  import warnings
  import numpy
  from scipy.spatial.distance import cdist
  from sklearn import neighbors
  from sklearn.utils import check_random_state
  from openTSNE import utils
label_desc: Use image node_id 3 for calling the Annoy obj's underlying member method code with example usage: obj.query(query, k) and returns: indices,  distances