class_docstr: Load NumPy arrays that were persisted to a zip file when pickling.
  
  :param zip_file: The zip file handle in which the NumPy arrays are saved.
  :type zip_file: :class:`zipfile.ZipFile`
class_docstr_tok: ["Load","NumPy","arrays","that","were","persisted","to","a","zip","file","when","pickling",".",":","param","zip_file",":","The","zip","file","handle","in","which","the","NumPy","arrays","are","saved",".",":","type","zip_file",":",":","class",":","`","zipfile.ZipFile","`"]
code: def __call__(self, persid):
      array_type, name = persid.split(".")
      del array_type
      # array_type was used for switching gpu/cpu arrays
      # it is better to put these into sublclasses properly
      # this is more work but better logic
      if name in self.cache:
          return self.cache[name]
      ret = None
      with self.zip_file.open(name) as f:
          ret = np.lib.format.read_array(f)
      self.cache[name] = ret
      return ret
  
imports: import os
  import pickle
  import sys
  import tempfile
  import zipfile
  from collections import defaultdict
  from contextlib import closing
  from io import BytesIO
  from pickle import HIGHEST_PROTOCOL
  import numpy
  import pytensor
  from pytensor.compile.sharedvalue import SharedVariable
label_desc: Use image node_id 2 for calling the PersistentNdarrayLoad obj's underlying member method code with example usage: obj.__call__(persid) and returns: ret, self