2016-10-19 31 views
1

我有如下形式的函數來實現在numpy的這個功能高效求和外積爲1D NumPy的陣列

enter image description here

的一種方式是組裝矩陣來總結以上:

y = a*b - np.sum(np.outer(a*b, b), axis=0) 

有沒有更好的方法來實現這個函數與numpy,不涉及創建一個NxN數組?

回答

2

你可以使用np.einsum -

y = a*b - np.einsum('i,i,j->j',a,b,b) 

我們也可以執行a*b和飼料到einsum -

y = a*b - np.einsum('i,j->j',a*b,b) 

在第二種方法,我們可以通過存儲a*b和重用節省一些運行。

運行測試 -

In [253]: a = np.random.rand(4000) 

In [254]: b = np.random.rand(4000) 

In [255]: %timeit np.sum(np.outer(a*b, b), axis=0) 
10 loops, best of 3: 105 ms per loop 

In [256]: %timeit np.einsum('i,i,j->j',a,b,b) 
10 loops, best of 3: 24.2 ms per loop 

In [257]: %timeit np.einsum('i,j->j',a*b,b) 
10 loops, best of 3: 21.9 ms per loop 
+0

@reptilicus這是形容它的最佳方式! :) – Divakar

+0

銖,我的評論被刪除。唉,審查員有我的號碼 – reptilicus

+0

@reptilicus哈哈,可能有一些孩子AI-bot在工作;) – Divakar