code: def processor_groups(mesh_shape, group_dims):
    
    group_numbers = [
        pnum_to_group(mesh_shape, group_dims, pnum)
        for pnum in xrange(mesh_shape.size)]
    ret = []
    for pnum, g in enumerate(group_numbers):
      while len(ret) <= g:
        ret.append([])
      ret[g].append(pnum)
    return ret
docs: Groups of processors which differ only in the given dimensions.
  
    Args:
      mesh_shape: a Shape
      group_dims: a list of integers
  
    Returns:
      a list of lists of integers (processor numbers)