使用Vectorization加速我的计算

时间:2012-09-26 09:05:59

标签: python numpy vectorization slice

我是python的新手,所以我的计算效率有些问题。 我正在使用此代码填充我的H矩阵和我的h向量(x_tr,x_te和c是列表):

for l in xrange(0, b):
    for ls in xrange(0, b):
        H[l][ls] = 1.0/n_tr * numpy.sum([numpy.exp(-((numpy.linalg.norm(x_tr[i]-c[l])**2 + numpy.linalg.norm(x_tr[i]-c[ls])**2)/(2*s**2))) for i in range(0, n_tr)])
    h[l] = 1.0/n_te * numpy.sum([numpy.exp(-((numpy.linalg.norm(x_te[j]-c[l])**2)/(2*s**2))) for j in range(0, n_te)])

我认为使用2个循环可能效率低下......有没有简单的方法可以加快我的计算速度?我被告知,我可能会使用Vectorization,但我不知道它是如何工作的

感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

矢量化示例:

>>> x_te = np.arange(10)
>>> c = np.range(5)
>>> (x_te[:,None] - c).sum(axis=0)
array([45, 35, 25, 15,  5])

相当于:

np.array([np.sum(xte[i]-c[j] for i in range(xte.size)) for j in range(c.size)])

那说:

由于x_te[j]c[l]是你圈中的两个标量,你的np.linalg.norm(x[j]-c[i])**2只是(x[j]-c[i]),对吗?因此,您的h可以计算为

h = 1.0/n_te * numpy.sum([numpy.exp(-(x_te[: None]-c))/(2*s**2))) 

哪个应该让你开始H ...

编辑您应该查看一些documentation on broadcasting