我有形狀(N*2)
的矩陣M1
和另一矩陣M2
(2*N)
,我想獲得的(N)
結果,每個元件i
是i
第i行的乘積M1
和i
第012列的M2
。 我試圖在NumPy的使用點,但它只能給我的矩陣乘法結果,這是(N*N)
,當然,我可以採取對角線這是我想要的,我想知道有沒有更好的方式來做到這個?計算產品 - NumPy的
1
A
回答
1
方法#1
您可以使用np.einsum
-
np.einsum('ij,ji->i',M1,M2)
說明:
原來糊塗的解決方案將是這個樣子 -
def original_app(M1,M2):
N = M1.shape[0]
out = np.zeros(N)
for i in range(N):
out[i] = M1[i].dot(M2[:,i])
return out
因此,對於每一次迭代,我們有:
out[i] = M1[i].dot(M2[:,i])
在迭代器尋找,我們需要對齊的M1
第一軸線與M2
第二軸線。同樣,因爲我們正在執行matrix-multiplication
並且由於其本身的定義與的M2
第一軸線對準的M1
第二軸線,並且還總結減少在每一次迭代這些元素。
當移植到einsum
,保持軸的兩個輸入端之間的對準指定字符串符號給它時具有相同的字符串。所以,輸入分別爲'ij,ji
,M1
和M2
。從M1
失去第二串後的輸出,這是與從在總和還原M2
第一串,應該保留i
。因此,完整的字符串符號將爲:'ij,ji->i'
,最終解決方案爲:np.einsum('ij,ji->i',M1,M2)
。
方法2
在M1
COLS或行數的在M2
數量是2
。因此,另外,我們就可以切片,進行逐元素乘法和總結這些,就像這樣 -
M1[:,0]*M2[0] + M1[:,1]*M2[1]
運行測試
In [431]: # Setup inputs
...: N = 1000
...: M1 = np.random.rand(N,2)
...: M2 = np.random.rand(2,N)
...:
In [432]: np.allclose(original_app(M1,M2),np.einsum('ij,ji->i',M1,M2))
Out[432]: True
In [433]: np.allclose(original_app(M1,M2),M1[:,0]*M2[0] + M1[:,1]*M2[1])
Out[433]: True
In [434]: %timeit original_app(M1,M2)
100 loops, best of 3: 2.09 ms per loop
In [435]: %timeit np.einsum('ij,ji->i',M1,M2)
100000 loops, best of 3: 13 µs per loop
In [436]: %timeit M1[:,0]*M2[0] + M1[:,1]*M2[1]
100000 loops, best of 3: 14.2 µs per loop
大規模加速那裏!
相關問題
- 1. numpy有效計算parafac/CP產品
- 2. C#產品計算工具
- 3. 使用LINQ計算產品
- 4. 計算Northwind產品數量
- 5. 衍生產品計算器
- 6. Numpy產品或張量產品問題
- 7. 多輸入計算矩陣產品
- 8. 折扣產品的錯誤計算
- 9. 計算沒有IML的內部產品
- 10. Java中的跨產品計算器
- 11. 計算產品累積和的麻煩
- 12. 外部產品計算的向量化
- 13. 只計算magento中的活動產品
- 14. 計算產品的總價值
- 15. numpy元素外部產品
- 16. Numpy的npv計算
- 17. 產品排序計算係數
- 18. 用Java計算點產品距離
- 19. 寫SQL查詢來計算產品
- 20. Magento - 已計算產品屬性(屬性)
- 21. Prestashop定製/計算產品價格
- 22. PHP:計算2個變量產品
- 23. Woocommerce - 購物車產品錯誤計算
- 24. 無稅產品價格計算
- 25. 產品統計
- 26. numpy的einsum:嵌套點產品
- 27. 加快multilple矩陣產品numpy的
- 28. 計算 - numpy python bug
- 29. GAE/J現場產品評分的碎片計數器計算
- 30. 建議產品的算法
不錯的答案,讓我消化了一段時間。愛因斯坦是強大的,但對於初學者來說似乎並不容易理解。 – 1a1a11a
你能解釋一點這是如何工作的?我正在閱讀文檔,很難理解 – 1a1a11a
@ 1a1a11a查看添加的評論是否有意義。 – Divakar