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

2024-09-27 21:26:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图高效地计算一个包含4个参数的python函数的多个实例,但是我找不到如何以不涉及本机python的slow for循环的方式将函数映射到多个输入值。在

下面是一个我只调用一次函数(即一次观察)的例子。在

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和{}。在

换句话说,我想要两个主输入数组,lower_bounds和{},它们都有shape(1000x5)。然后我要重复这个过程1000次,计算lower_bounds[0]upper_bounds[0],然后是{}和{},如此类推,直到lower_bounds[999]和{}。在

在scipy的文档中,我发现我可以对这个函数进行矢量化/映射,但只限于上限,使下限固定。可以这样做:

^{pr2}$

这样,mvnun将使用一个固定的下界进行多次求值,并迭代upper_bound的所有1000行。在

有人知道如何调整上面的代码片段,这样我就可以使用一个下界的数组,而不是固定的下界?在

谢谢!在

附言:这个问题是对this的一点更新。这里也有一些有趣的见解here,但是它们提供的解决方案非常慢,因为它们使用常规的python循环。{a3}更多想法。在


Tags: 函数npscipy数组covupperlowerone
1条回答
网友
1楼 · 发布于 2024-09-27 21:26:43

仅供参考。 不确定它是否足够有效。在我的机器上,它比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)

相关问题 更多 >

    热门问题