簡體   English   中英

2d numpy數組的乘法/除法產生3d數組

[英]Multiplication/Division of 2d numpy arrays to produce 3d array

我正在尋找一種快速(即矢量化)的方法來替換以下循環。 我有2個numpy數組,其尺寸為(20738,14)和(31,14)。 我需要將它們逐個元素相乘以獲得(20738,31,14)的數組。 我一直在嘗試各種廣播配置,但似乎無法獲得理想的結果。

    v_mu_3d = np.zeros((v.shape[0], ALT_LEN, NEST_LEN))
    for k in range(NEST_LEN):
        v_mu_3d[:,:,k] = v * MU[:,k]
    v_mu_3d = np.exp(v_mu_3d)

類似的操作如下:

p2_3d = np.zeros((v.shape[0], ALT_LEN, NEST_LEN))
    for j in range(ALT_LEN):
        num = v_mu_3d[:,:,:].sum(axis=1)
        temp_MU = MU[j,:]
        num = ne.evaluate('where(temp_MU >0, num / temp_MU, 0)')
        denom = num.sum(axis=1)
        denom = denom[:, np.newaxis]
        p2_3d[:, j, :] = num / denom

我可以將底部替換為:

p2_3d = v_mu_3d.sum(axis=1) / v_mu_3d.sum(axis=2).sum(axis=1)[:,None]

但似乎無法弄清楚:

num / MU

它應該采用(20738,14)num數組,然后將元素逐個除以(31,14)MU數組。 np.repeat()可能有效,但是速度至關重要,因為包含函數在最小化例程中運行了數千次。

更新根據Nils Werner的回答,這些循環可以簡化為:1)

p1_3d = v_mu_3d / v_mu_3d.sum(axis=1)[:,None,:]

和2)

num = v_mu_3d.sum(axis=1)
num = np.where(MU>0, num[:,None,:] / MU, 0)
p2_3d = num / num.sum(axis=1)[:,None,:]

只需使用廣播:

v.shape
# (20738, 14)
MU.shape
# (31, 14)

v_mu_3d = v[:, None, :] * MU
p2_3d = v[:, None, :] / MU

v_mu_3d.shape
# (20738, 31, 14)
p2_3d.shape
# (20738, 31, 14)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM