On 22 мар, 01:27, Peter Otten <__pete...@web.de> wrote: > Jah_Alarm wrote: > > I've got a vector length n of integers (some of them are repeating), > > and I got a selection probability vector of the same length. How will > > I sample with replacement k (<=n) values with the probabilty vector. > > In Matlab this function is randsample. I couldn't find anything to > > this extent in Scipy or Numpy. > > If all else fails you can do it yourself: > > import random > import bisect > > def iter_sample_with_replacement(values, weights): > _random = random.random > _bisect = bisect.bisect > > acc_weights = [] > sigma = 0 > for w in weights: > sigma += w > acc_weights.append(sigma) > while 1: > yield values[_bisect(acc_weights, _random()*sigma)] > > def sample_with_replacement(k, values, weights): > return list(islice(iter_sample_with_replacement(values, weights), k)) > > if __name__ == "__main__": > from itertools import islice > N = 10**6 > values = range(4) > weights = [2, 3, 4, 1] > > histo = [0] * len(values) > for v in islice(iter_sample_with_replacement(values, weights), N): > histo[v] += 1 > print histo > print sample_with_replacement(30, values, weights) > > Peter
thanks a lot, Alex -- http://mail.python.org/mailman/listinfo/python-list