我正在尝试有效地评估一个带有4个参数的python函数的多个实例,但是我找不到如何不以本机python的慢速循环方式将函数映射到多个输入值的方法
这是我仅调用一次函数的一个示例(即,一次观察)。
from scipy.stats.mvn import mvnun
lower_bounds_one_obs = np.full(5, -1)
upper_bounds_one_obs = np.full(5, 1)
cov_mtx = np.eye(5)
means = np.zeros(5)
single_result = mvnun(lower_bounds_one_obs, upper_bounds_one_obs, means, cov_mtx)[0]
print(single_result)
出于上下文考虑,mvnun
函数计算上下限之间的多元正态分布的矩形CDF。在这种情况下,上下限中有5个元素。
我想做的是为上下限的数组计算mvnun
,但始终使用相同的means
和cov_mtx
。
换句话说,我想有两个主输入数组lower_bounds
和lower_bounds
,它们的形状都为(1000 x 5)。然后,我将经历1000次处理,计算mvnun
和lower_bounds[0]
的{{1}},然后计算upper_bounds[0]
和lower_bounds[1]
,依此类推,直到{ {1}}和upper_bounds[1]
。
在scipy的文档中,我发现我可以矢量化/映射此函数,但仅适用于上限,使下限固定。可以这样做:
lower_bounds[999]
通过这种方式,对upper_bounds[999]
进行了多次评估,并设置了固定的下限,并迭代了lower_fixed = np.full(5, -np.inf)
upper_bounds = np.random.rand(5 * 1000).reshape((1000, 5))
func1d = lambda upper_slice: mvnun(lower_fixed, upper_slice, means, cov_mtx)[0]
out = np.apply_along_axis(func1d, -1, upper_bounds)
的所有1000行。
有人知道如何调整上面的代码段,以便我可以使用下限的数组而不是固定的下限?
谢谢!
PS:这个问题是对this的更新。也有一些有趣的见解here,但是它们提供的解决方案非常慢,因为它们使用常规的python循环。 here也有更多想法。
答案 0 :(得分:0)
仅供参考。
不知道它是否足够有效。在我的机器上,它比np.fromiter
和python map
结合起来要快一些。
lower_bounds = np.full((1000,5), -np.inf)
upper_bounds = np.random.rand(1000, 5)
bounds = np.concatenate([lower_bounds, upper_bounds], axis=1)
func1d = lambda bound: mvnun(bound[:5], bound[5:], means, cov_mtx)[0]
out = np.apply_along_axis(func1d, -1, bounds)