簡體   English   中英

在 python 中廣播的逐元素多維矩陣乘法

[英]Element-wise multidimension matrix multiplication with broadcasting in python

是否有一種有效的(numpy 函數)方法來對兩個不同大小的 arrays 進行逐元素矩陣乘法,這將廣播到一個新數組中。 例如,

a = np.arange(24).reshape((2,12)) #gives a 2x12 array 
b = np.arange(36).reshape((3,12)) #gives a 3x12 array

然后它將沿維度乘以 12(不求和)以給出最終的 3 維矩陣“c”,其形狀為 2x3x12,其中

c[0,0,:] = [a[0,0]*b[0,0], a[0,1]*b[0,1], ... a[0,11]*b[0,11]]
c[1,0,:] = [a[1,0]*b[0,0], a[1,1]*b[0,1], ... a[1,11]*b[0,11]]
c[0,1,:] = [a[0,0]*b[1,0], a[0,1]*b[1,1], ... a[0,11]*b[1,11]]

我可以通過以下方式得到我想要的:

a2 = np.repeat(a[..., np.newaxis], 3, axis=2)
b2 = b.T[np.newaxis, ...]
c = np.swapaxes(a2*b2, 1, 2)

輸出:

array([[[  0,   1,   4,   9,  16,  25,  36,  49,  64,  81, 100, 121],
        [  0,  13,  28,  45,  64,  85, 108, 133, 160, 189, 220, 253],
        [  0,  25,  52,  81, 112, 145, 180, 217, 256, 297, 340, 385]],

       [[  0,  13,  28,  45,  64,  85, 108, 133, 160, 189, 220, 253],
        [144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529],
        [288, 325, 364, 405, 448, 493, 540, 589, 640, 693, 748, 805]]])

但是對於我認為不應該太罕見的事情,使用五個 numpy 命令感覺效率真的很低。

當然,您可以使用廣播:

out = a[:, None, :] * b[None, :, :]

出去:

array([[[  0,   1,   4,   9,  16,  25,  36,  49,  64,  81, 100, 121],
        [  0,  13,  28,  45,  64,  85, 108, 133, 160, 189, 220, 253],
        [  0,  25,  52,  81, 112, 145, 180, 217, 256, 297, 340, 385]],

       [[  0,  13,  28,  45,  64,  85, 108, 133, 160, 189, 220, 253],
        [144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529],
        [288, 325, 364, 405, 448, 493, 540, 589, 640, 693, 748, 805]]])

暫無
暫無

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

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