code: def vecdot(x1: Array, x2: Array, /, *, axis: int = -1) -> Array:
      if (
          x1.dtype not in _numeric_dtypes
          or x2.dtype not in _numeric_dtypes
      ):
          raise TypeError("Only numeric dtypes are allowed in vecdot")
      ndim = max(x1.ndim, x2.ndim)
      x1_shape = (1,) * (ndim - x1.ndim) + tuple(x1.shape)
      x2_shape = (1,) * (ndim - x2.ndim) + tuple(x2.shape)
      if x1_shape[axis] != x2_shape[axis]:
          raise ValueError(
              "x1 and x2 must have the same size along the given axis"
          )
  
      x1_, x2_ = np.broadcast_arrays(x1._array, x2._array)
      x1_ = np.moveaxis(x1_, axis, -1)
      x2_ = np.moveaxis(x2_, axis, -1)
  
      res = x1_[..., None, :] @ x2_[..., None]
      return Array._new(res[..., 0, 0])
  
imports: from __future__ import annotations
  import functools
  from ._dtypes import _floating_dtypes, _numeric_dtypes
  from ._manipulation_functions import reshape
  from ._array_object import Array
  from .._core.internal import _normalize_axis_indices
  from typing import TYPE_CHECKING
  from typing import NamedTuple
  import cupy
label_desc: Use image node_id 23 for calling a global function with example usage: vecdot() and returns: Array