shouldn't this actually return a MultiIndex?  seems like you're just building something that returns the arguments to an MI... might make more sense to call it to_hierarchical and then provide it with an optional K value?  Also, I think you need to validate this on the Index side, because N must be < len(index),(otherwise np.arange(N) would exceed the range of values on the output side).