class_docstr: Generalized function class.
  
  .. seealso:: :class:`numpy.vectorize`
code: def __call__(self, *args):
      itypes = "".join([_get_input_type(x) for x in args])
      kern = self._kernel_cache.get(itypes, None)
  
      if kern is None:
          in_types = [_cuda_types.Scalar(t) for t in itypes]
          ret_type = None
          if self.otypes is not None:
              # TODO(asi1024): Implement
              raise NotImplementedError
  
          func = _interface._CudaFunction(
              self.pyfunc, "numpy", device=True
          )
          result = func._emit_code_from_types(in_types, ret_type)
          in_params = ", ".join(
              f"{t.dtype} in{i}" for i, t in enumerate(in_types)
          )
          in_args = ", ".join([f"in{i}" for i in range(len(in_types))])
          call = f"{result.func_name}({in_args})"
          out_params, body = self._get_body(result.return_type, call)
          # note: we don't worry about -D not working on ROCm here, because
          # we unroll all headers for HIP and so thrust::tuple et al are all
          # defined regardless if CUPY_JIT_MODE is defined or not
          kern = _core.ElementwiseKernel(
              in_params,
              out_params,
              body,
              "cupy_vectorize",
              preamble=result.code,
              options=("-DCUPY_JIT_MODE", "--std=c++14"),
          )
          self._kernel_cache[itypes] = kern
  
      return kern(*args)
  
file_path: cupy/cupy/_functional/vectorize.py
imports: import numpy
  from cupy import _core
  from cupyx.jit import _interface
  from cupyx.jit import _cuda_types
label_desc: Use image node_id 3 for calling the vectorize obj's underlying member method code with example usage: obj.__call__() and returns: kern