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。此外,我的建议可以写得更好一些,但它应该可以解决您的问题并大大加快计算速度:)
添加回答
举报
