使用numpy映射具有多个输入的函数

时间:2018-07-23 00:35:12

标签: python function numpy mapping vectorization

我正在尝试有效地评估一个带有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,但始终使用相同的meanscov_mtx

换句话说,我想有两个主输入数组lower_boundslower_bounds,它们的形状都为(1000 x 5)。然后,我将经历1000次处理,计算mvnunlower_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也有更多想法。

1 个答案:

答案 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)