我有兩個(gè)矩陣:>>>?a.shape
(100,?3,?1)
>>>?b.shape
(100,?3,?3)我想執(zhí)行點(diǎn)積,使最終結(jié)果為 (100, 3, 1)。但是,目前我收到:>>>?c?=?np.dot(b,?a)
>>>?c.shape
(100,?3,?100,?1)有人可以解釋發(fā)生了什么事嗎?我正在閱讀文檔,但無法弄清楚。編輯:所以根據(jù)文檔(忽略它):如果a和b都是2維數(shù)組,就是矩陣乘法,但是優(yōu)先使用matmul或者a@b。這給出了預(yù)期的結(jié)果,但我仍然很好奇,這里發(fā)生了什么?np.dot應(yīng)用什么函數(shù)規(guī)則來產(chǎn)生 的結(jié)果(100, 3, 100, 1)?
2 回答

倚天杖
TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
這就是 dot 在您的情況下的工作原理:
dot(b, a)[i,j,k,m] = sum(b[i,j,:] * a[k,:,m])
您的輸出形狀正是文檔指定的方式:
(b.shape[0], b.shape[1], a.shape[0], a.shape[2])
如果這不是您所期望的,您可能正在尋找另一個(gè)矩陣乘法。

長風(fēng)秋雁
TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
dot
將返回存儲在數(shù)組最后兩個(gè)維度中的矩陣的所有可能的乘積。使用matmul
aka@
運(yùn)算符廣播主要維度而不是組合它們:
np.matmul(b, a)
或者
b @ a
和積的瑞士軍刀是einsum
,所以你也可以使用它:
np.einsum('aij,ajk->aik', b, a)
或者
np.einsum('ajk,aij->aik', a, b)
添加回答
舉報(bào)
0/150
提交
取消