code: def ctype_to_dtype(cl_type, mot_float_type='float'):
      
      if is_vector_ctype(cl_type):
          raw_type, vector_length = split_vector_ctype(cl_type)
  
          if raw_type == 'mot_float_type':
              if is_vector_ctype(mot_float_type):
                  raw_type, _ = split_vector_ctype(mot_float_type)
              else:
                  raw_type = mot_float_type
  
          vector_type = raw_type + str(vector_length)
          return getattr(cl_array.vec, vector_type)
      else:
          if cl_type == 'mot_float_type':
              cl_type = mot_float_type
  
          data_types = [
              ('char', np.int8),
              ('uchar', np.uint8),
              ('short', np.int16),
              ('ushort', np.uint16),
              ('int', np.int32),
              ('uint', np.uint32),
              ('long', np.int64),
              ('ulong', np.uint64),
              ('float', np.float32),
              ('double', np.float64),
          ]
          for ctype, dtype in data_types:
              if ctype == cl_type:
                  return dtype
docs: Get the numpy dtype of the given cl_type string.
  
      Args:
          cl_type (str): the CL data type to match, for example 'float' or 'float4'.
          mot_float_type (str): the C name of the ``mot_float_type``. The dtype will be looked up recursively.
  
      Returns:
          dtype: the numpy datatype