code: def colstack(seq, mode='abort',returnnaming=False):
      assert mode in ['first','drop','abort','rename'], \
         'mode argument must take on value "first","drop", "rename", or "abort".'
      AllNames = utils.uniqify(utils.listunion(
                                             [list(l.dtype.names) for l in seq]))
      NameList = [(x, [i for i in range(len(seq)) if x in seq[i].dtype.names]) 
                       for x in AllNames]
      Commons = [x[0] for x in NameList if len(x[1]) > 1]
      if len(Commons) > 0 or mode == 'first':
          if mode == 'abort':
              raise ValueError('There are common column names with differing ' +              
                               'values in the columns')
          elif mode == 'drop':
              Names = [(L[0], x,x) for (x, L) in NameList if x not in Commons]
          elif mode == 'rename':
              NameDict = dict(NameList)
              Names = utils.listunion([[(i,n,n) if len(NameDict[n]) == 1 else \
                 (i,n,n + '_' + str(i)) for n in s.dtype.names] \
                                     for (i,s) in enumerate(seq)])                           
      else:
          Names = [(L[0], x,x) for (x, L) in NameList]
      if returnnaming:
          return  utils.fromarrays([seq[i][x] for (i, x,y) in Names], 
                   type= np.ndarray,names=zip(*Names)[2]),Names
      else:
          return utils.fromarrays([seq[i][x] for (i, x,y) in Names], 
                   type= np.ndarray,names=zip(*Names)[2])