亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 numpy 數組對函數進行矢量化

使用 numpy 數組對函數進行矢量化

萬千封印 2022-10-18 16:35:35
我正在嘗試加快我編寫的一些代碼的速度,但這樣做會遇到很多麻煩。我知道能夠刪除 for 循環并使用 numpy 可以幫助做到這一點,所以這就是我一直在嘗試但收效甚微的事情。沒有任何加速的工作函數是def acf(x, y, z, cutoff=0):    steps = x.shape[1]    natoms = x.shape[0]    z_x = np.zeros((steps,natoms))    z_y, z_z = np.zeros_like(z_x), np.zeros_like(z_x)    xmean = np.mean(x, axis=1)    ymean = np.mean(y, axis=1)    zmean = np.mean(z, axis=1)    for k in range(steps-cutoff): # x.shape[1]        xtemp, ytemp, ztemp = [], [], []        for i in range(x.shape[0]): # natoms            xtop, ytop, ztop = 0.0, 0.0, 0.0            xbot, ybot, zbot = 0.0, 0.0, 0.0            for j in range(steps-k): # x.shape[1]-k                xtop += (x[i][j] - xmean[i]) * (x[i][j+k] - xmean[i])                ytop += (y[i][j] - ymean[i]) * (y[i][j+k] - ymean[i])                ztop += (z[i][j] - zmean[i]) * (z[i][j+k] - zmean[i])                xbot += (x[i][j] - xmean[i])**2                ybot += (y[i][j] - ymean[i])**2                zbot += (z[i][j] - zmean[i])**2            xtemp.append(xtop/xbot)            ytemp.append(ytop/ybot)            ztemp.append(ztop/zbot)        z_x[k] = xtemp        z_y[k] = ytemp        z_z[k] = ztemp    z_x = np.mean(np.array(z_x), axis=1)    z_y = np.mean(np.array(z_y), axis=1)    z_z = np.mean(np.array(z_z), axis=1)    return z_x, z_y, z_z此函數的輸入 x、y 和 z 是相同維度的 numpy 數組。x(或 y 或 z)的一個例子是:x = np.array([[1,2,3],[4,5,6]])到目前為止,我能夠做的是def acf_quick(x, y, z, cutoff=0):    steps = x.shape[1]    natoms = x.shape[0]    z_x = np.zeros((steps,natoms))    z_y, z_z = np.zeros_like(z_x), np.zeros_like(z_x)    x -= np.mean(x, axis=1, keepdims=True)    y -= np.mean(y, axis=1, keepdims=True)    z -= np.mean(z, axis=1, keepdims=True)這將其速度提高了約 33%,但我相信有一種方法可以刪除for i in range(natoms)使用類似x[:][j]. 到目前為止,我一直沒有成功,任何幫助將不勝感激。在有人問之前,我知道這是一個自相關函數,并且有幾個內置于 numpy、scipy 等,但我需要自己編寫。
查看完整描述

1 回答

?
HUWWW

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。此外,我的建議可以寫得更好一些,但它應該可以解決您的問題并大大加快計算速度:)


查看完整回答
反對 回復 2022-10-18
  • 1 回答
  • 0 關注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號