Вы можете использовать логическую маску в numpy для регенерации значений, которые находятся за пределами требуемых границ.Например:
def random_with_bounds(func, size, bounds):
x = func(size=size)
r = (x < bounds[0]) | (x > bounds[1])
while r.any():
x[r] = func(size=r.sum())
r[r] = (x[r] < bounds[0]) | (x[r] > bounds[1])
return x
Тогда вы можете использовать его следующим образом:
random_with_bounds(np.random.normal, 1000, (-1, 1))
Другая версия, использующая индексные массивы через np.argwhere
, дает немного увеличенную производительность:
def random_with_bounds_2(func, size, bounds):
x = func(size=size)
r = np.argwhere((x < bounds[0]) | (x > bounds[1])).ravel()
while r.size > 0:
x[r] = func(size=r.size)
r = r[(x[r] < bounds[0]) | (x[r] > bounds[1])]
return x