2012-09-26 45 views
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圈......有沒有簡單的加快我的計算速度的方法?有人告訴我,我可能會使用矢量化,但我有點不知道這是如何工作

感謝您的幫助:)

+0

你還不清楚什麼?你有沒有試過一個numpy教程? –

+0

我甚至可以使用矢量化來加速計算嗎? 我嘗試了一些教程,但我不太明白,我怎樣才能將他們的例子引用到我的計算中 – hukd321

+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

+0

感謝您的幫助! 使用此代碼爲h,我得到此錯誤: TypeError:不支持的操作數類型爲 - :'列表'和'列表' – hukd321

+0

這告訴你,你正在使用列表而不是numpy數組,如我所示你在這個例子中:'x_te'和'c'應該是數組.. .. –

+0

啊......是的,你說得對...我應該看到... x_te [i]和c [j ]沒有標量,它們依賴於輸入的維度,這就是爲什麼我使用numpy.linalg.norm(...) – hukd321