Randomly split a vector into N bins of random lengths
np.random.choice can just take an int, so that can simplify your code - no need to build up a range():

splits = sorted(1 + x 
    for x in np.random.choice(len(vector)-1, nbins-1, replace=True))


When you build up the bins, you don't need a try/except (you know up front what the size is). You just need to iterate over the actual splits:

bins = []

last = 0
for split in splits:
    bins.append(permutation[last:split])
    last = split
bins.append(permutation[split:])