1 回答

TA貢獻1874條經驗 獲得超12個贊
這是循環的矢量化形式:
def acf_quick_new(x, y, z, cutoff=0):
steps = x.shape[1]
natoms = x.shape[0]
lst_inputs = [x.copy(),y.copy(),z.copy()]
lst_outputs = []
for x_ in lst_inputs:
z_x_ = np.zeros((steps,natoms))
x_ -= np.mean(x_, axis=1, keepdims=True)
x_top = np.diag(np.dot(x_,x_.T))
x_bot = np.sum(x_**2, axis=1)
z_x_[0,:] = np.divide(x_top, x_bot)
for k in range(1,steps-cutoff): # x.shape[1]
x_top = np.diag(np.dot(x_[:,:-k],x_.T[k:,:]))
x_bot = np.sum(x_[:,:-k]**2, axis=1)
z_x_[k,:] = np.divide(x_top, x_bot)
z_x_ = np.mean(np.array(z_x_), axis=1)
lst_outputs.append(z_x_)
return lst_outputs
請注意,在您的 _quick-function 中有一個小錯誤:您總是除以 xbot 而不是 xbot、ybot 和 zbot。此外,我的建議可以寫得更好一些,但它應該可以解決您的問題并大大加快計算速度:)
添加回答
舉報