我正在嘗試有效地計算許多點積。這篇文章非常接近我想要做的事情,但我無法讓它發揮作用。我有一個大的矩陣列表(a)和一個向量列表(b)。我想在他們之間做一系列的點積運算。這就是現在的工作:import numpy as npa # shape (15000,4,4)b # shape (15000,4)out = np.empty((15000,4))for i in range(15000): out[i] = np.dot(a[i],b[i])我從鏈接的帖子中調整 np.tensordot 或 np.einsum 的所有嘗試都未能給我想要的東西。如果有人知道如何做到這一點,我將不勝感激。
1 回答
哆啦的時光機
TA貢獻1779條經驗 獲得超6個贊
愛因斯坦求和工作得很好:
>>> a = np.random.randn(100, 4, 4)
>>> b = np.random.randn(100, 4)
>>> foo = np.einsum('ijk,ik->ij', a, b)
>>> bar = np.zeros_like(foo)
>>> for i, (ai, bi) in enumerate(zip(a, b)):
bar[i] = np.dot(ai, bi)
>>> np.allclose(foo, bar)
True
為了稍微解釋一下總和,請注意您正在收縮. b因此,您可以考慮將每個內積視為按np.einsum('jk,k->j', a[0], b[0]). 但是我們對aand的每個元素都做一個b,因此包含了第一個軸,它沒有收縮。因此,ijk,ik->ij。
添加回答
舉報
0/150
提交
取消
