1

我是 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 个循环可能效率低下......有什么简单的方法可以加快我的计算速度吗?有人告诉我,我可能会使用矢量化,但不知何故我不知道它是如何工作的

谢谢你的帮助 :)

4

1 回答 1

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......

编辑您可能应该检查一些有关广播的文档

于 2012-09-26T09:35:04.377 回答