python - 根据 np.random.random 的结果制定 if/elif 语句的更有效方法?
问题描述
我正在尝试加快我的代码,该代码具有以下形式的长 if/elif 语句:
random = np.random.random()
tot = a + b + c + d
if random < a/tot:
var1 += 1
elif a/tot < random < (a+b)/tot:
var1 -= 1
elif (a+b)/tot < random < (a+b+c)/tot:
var2 += 1
elif (a+b+c)/tot < random < 1:
var2 -= 1
我试图想办法用字典来做到这一点,但我不知道如何索引它。代码按原样工作,但是我正在尝试加快这部分代码的速度,这会占用大量运行时间。有没有其他方法可以做到这一点?
解决方案
您可以使用二分法来确定您的随机数落在哪个“bin”中:
bins = np.cumsum([0., a, b, c, d])
bins /= bins.sum()
updates_var1 = [1, -1, 0, 0]
updates_var2 = [0, 0, 1, -1]
index = bisect.bisect(bins, random) - 1
var1 += updates_var1[index]
var2 += updates_var2[index]
这个解决方案可以通过使用np.searchsorted
而不是矢量化bisect.bisect
。
推荐阅读
- android - 时间选择器片段区分
- reactjs - react-create-app 中的 babel 加载器问题
- html - CSS图像幻灯片图像彼此相邻
- excel - 如果任何列包含条件格式的红色单元格,则删除行
- django - 用 django 为餐厅菜单建模
- android - 我开发的 APK 以前可以正常工作,但突然停止工作并出现“未安装应用程序”错误
- android - Ionic 4-cordova-admob-pro 上传后不会显示广告
- html - 在 html 网站上添加了不需要的具有大高度值的 full_body_spacer
- python - 在 Python 中从 csv 文件生成字符串集
- r - 如何在 DT 标头中显示 HTML?