code: def array(source_array, ctx=None, dtype=None):
      
      if isinstance(source_array, NDArray):
          dtype = source_array.dtype if dtype is None else dtype
      else:
          dtype = mx_real_t if dtype is None else dtype
          if not isinstance(source_array, np.ndarray):
              try:
                  source_array = np.array(source_array, dtype=dtype)
              except:
                  raise TypeError('source_array must be array like object')
      arr = empty(source_array.shape, ctx, dtype)
      arr[:] = source_array
      return arr
docs: Creates an array from any object exposing the array interface.
  
      Parameters
      ----------
      source_array : array_like
          An object exposing the array interface, an object whose `__array__`
          method returns an array, or any (nested) sequence.
      ctx : Context, optional
          Device context (default is the current default context).
      dtype : str or numpy.dtype, optional
          The data type of the output array. The default dtype is ``source_array.dtype``
          if `source_array` is an `NDArray`, `float32` otherwise.
  
      Returns
      -------
      NDArray
          An `NDArray` with the same contents as the `source_array`.