我正在尝试模拟现实生活过程的表现。历史上已测量的变量显示固定的间隔,因此值越小越好,以至于这些值在物理上是不可能的。
为模拟过程输出,每个输入变量历史数据分别表示为最佳拟合概率分布(使用这种方法:Fitting empirical distribution to theoretical ones with Scipy (Python)?)。
但是,当模拟n次时所得的理论分布并不代表实际的预期最小和最大值。我正在考虑对每个模拟应用“试一试”测试,以检查每个模拟值是否在预期间隔之间,但是由于未达到实验均值和方差,因此我不确定这是否是处理此问题的最佳方法。 / p>
答案 0 :(得分:1)
您可以在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