如何以矢量化形式编写这个numpy代码?

时间:2015-09-11 23:13:52

标签: python numpy scipy vectorization

我在python中有以下函数,我无法弄清楚如何以矢量化形式表达。 对我来说,cov是一个numpy形状的阵列(2,2),mu是具有形状(2,)的平均向量,而xtp是形状(~50000,2)。 我知道scipy提供了scipy.stats.multivariate_normal.pdf,但我正在尝试学习如何编写高效的矢量化代码。请

def mvnpdf(xtp, mu, cov):
    temp = np.zeros(xtp.shape[0])
    i = 0
    length = xtp.shape[0]
    const = 1 / ( ((2* np.pi)**(len(mu)/2)) * (np.linalg.det(cov)**(1/2)) )
    inv = np.linalg.inv(cov)
    while i < length:
        x = xtp[i]-mu
        exponent = (-1/2) * (x.dot(inv).dot(x))
        temp[i] =  (const * np.exp(exponent))
        i+=1
    return temp

1 个答案:

答案 0 :(得分:4)

向量化唯一棘手的部分是双<Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="VS2015_ROOT_FOLDER"> 。让我们分开:

.dot

将它放在你的代码中,看它是否产生同样的东西。

有几种“矢量化”x = xtp - mu # move this out of the loop ddot = [i.dot(inv).dot(i) for i in x] temp = const * np.exp(-0.5 * ddot) 的方法。我首先要尝试的是dot。在我的测试中,这是等效的:

einsum

我建议尝试一下,看它是否有效并加快速度。并且在交互式shell中使用较小的数组(不是~50000)进行这些计算。

我正在使用

进行测试
ddot = np.einsum('ij,jk,ik->i',x,inv,x)

由于这是一个学习练习,我会把细节留给你。

使用In [225]: x Out[225]: array([[ 0., 2.], [ 1., 3.], ... [ 7., 9.], [ 8., 10.], [ 9., 11.]]) In [226]: inv Out[226]: array([[ 1., 0.], [ 0., 1.]]) ,一个(2,2)的计算可能会更快地完成,而不是使用covdet函数。但是inv迭代就是时间消费者。