class_docstr: A reader for OME-NGFF files with the .zarr extension. Supports both 'normal' and
  'HCS' storage modes.
  
  OME-NGFF files below spec version 0.4 which are stored on S3/object storage
  should have the zarr.convenience.consolidate_metadata() function run on them
  to provide optimal performance over a network.
  
  Other non-OME .zarr format images may be readable, but are not strictly supported.
docstr: Searches a zarr object and produces a list of arrays within that object.
  :param zarr_obj: zarr.Array or zarr.Group to scan.
  :param multiscales: True = Consider all resolutions as arrays. False = Only return resolution 0.
  :param first_only: True = only grab the first array, don't bother scanning the whole file.
  :return: List of tuples in format (zarr_array, name). Empty string denotes no special name.
docstr_tok: ["Searches","a","zarr","object","and","produces","a","list","of","arrays","within","that","object",".",":","param","zarr_obj",":","zarr.Array","or","zarr.Group","to","scan",".",":","param","multiscales",":","True","=","Consider","all","resolutions","as","arrays",".","False","=","Only","return","resolution","0.",":","param","first_only",":","True","=","only","grab","the","first","array",",","do","n't","bother","scanning","the","whole","file",".",":","return",":","List","of","tuples","in","format","(","zarr_array",",","name",")",".","Empty","string","denotes","no","special","name","."]
code: def find_arrays(self, zarr_obj, multiscales=False, first_only=False):
      """
      Searches a zarr object and produces a list of arrays within that object.
      :param zarr_obj: zarr.Array or zarr.Group to scan.
      :param multiscales: True = Consider all resolutions as arrays. False = Only return resolution 0.
      :param first_only: True = only grab the first array, don't bother scanning the whole file.
      :return: List of tuples in format (zarr_array, name). Empty string denotes no special name.
      """
      if isinstance(zarr_obj, zarr.Array):
          # We're already pointed directly at an array object. No scan needed.
          return [(zarr_obj, "")]
      if self._series_map is not None:
          return [
              (zarr_obj[path], name) for path, name in self._series_map
          ]
      # Groups should be a list of groups which contain arrays as children.
      result = []
  
      for group_obj, group_name in self.iterate_groups(zarr_obj):
          if isinstance(group_obj, zarr.Array):
              result.append((group_obj, group_name))
          elif "multiscales" in group_obj.attrs:
              # The main reason we do this - do we want just resolution 0 or all resolutions?
              scales = group_obj.attrs["multiscales"]
              if multiscales:
                  for params in scales[0]["datasets"]:
                      key = params["path"]
                      result.append((group_obj[key], group_name))
              else:
                  key = scales[0]["datasets"][0]["path"]
                  result.append((group_obj[key], group_name))
          else:
              LOGGER.error(
                  f"Subgroup has no contents? {group_obj.path}"
              )
          if first_only:
              break
      return result
  
imports: import numpy
  import zarr
  from ..constants.image import MD_SIZE_S, MD_SIZE_C, MD_SIZE_Z, MD_SIZE_T, MD_SIZE_Y, MD_SIZE_X, MD_SERIES_NAME
  from ..constants.reader import ZARR_FILETYPE
  from ..reader import Reader
  import os
  import re
  import logging
  from lxml import etree
label_desc: Use image node_id 12 for calling the NGFFReader obj's underlying member method code with example usage: obj.find_arrays(zarr_obj, multiscales, first_only) and returns: result, list, unknown