我是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 个循环可能效率低下...有什么简单的方法可以加快我的计算速度吗?有人告诉我,我可以使用矢量化,但我不知道它是如何工作的
感谢您的帮助:)
最佳答案
矢量化示例:
>>> 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)])
也就是说:
as 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 .
关于python - 使用矢量化加速计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12598189/