【发布时间】:2016-10-04 19:38:00
【问题描述】:
我正在寻找模拟经典频率严重性分布的方法,例如: X = sum(i = 1..N, Y_i),其中 N 是例如泊松分布和 Y 对数正态分布。
简单的 numpy 脚本是:
import numpy as np
SIM_NUM = 3
X = []
for _i in range(SIM_NUM):
nr_claims = np.random.poisson(1)
temp = []
for _j in range(nr_claims):
temp.append(np.random.lognormal(0, 1))
X.append(sum(temp))
现在我尝试将其矢量化以提高性能。更好一点的是:
N = np.random.poisson(1, SIM_NUM)
X = []
for n in N:
X.append(sum(np.random.lognormal(0, 1, n)))
我的问题是我是否仍然可以矢量化第二个循环?例如,通过以下方式模拟所有损失:
N = np.random.poisson(1, SIM_NUM)
# print(N) would lead to something like [1 3 0]
losses = np.random.lognormal(0,1, sum(N))
# print(N) would lead to something like
#[ 0.56750244 0.84161871 0.41567216 1.04311742]
# X should now be [ 0.56750244, 0.84161871 + 0.41567216 + 1.04311742, 0]
我的想法是“智能切片”或“A = [[1, 0, 0, 0]],[0,1,1,1],[0,0,0,0] 的矩阵乘法]。但我无法从这些想法中做出一些聪明的事情。
我正在寻找最快的 X 计算。
【问题讨论】:
标签: python performance numpy vectorization