2015-04-28 56 views
3

W是尺寸(x, nP)的一些矩陣[見問題結束]如何矢量化此累積操作?

現在,我做了下面的代碼:

uUpperDraw = np.zeros(W.shape) 
for p in np.arange(0, nP): 
    uUpperDraw[s, p] = (W[s+1,:(p+1)]).sum() 

我想向量化這對提高效率。鑑於pGrid = [0, 1, ...],我如何重現以下內容?

uUpperDraw = np.array([sum(W[x, 0]), sum(W[x,0] + W[x, 1]), sum(W[x,0] + W[x, 1] + W[x, 2]) ... 

這裏有一些可重複的例子。

>>> s, nP 
(3, 10) 
>>> W 

array([[ 0.  , 0.  , 0.  , 0.  , 0.  , 
     0.  , 0.  , 0.  , 0.  , 0.  ], 
     [ 0.  , 0.  , 0.  , 0.  , 0.  , 
     0.  , 0.  , 0.  , 0.  , 0.  ], 
     [ 0.  , 0.  , 0.  , 0.  , 0.  , 
     0.  , 0.  , 0.  , 0.  , 0.  ], 
     [ 0.  , 0.  , 0.  , 0.  , 0.  , 
     0.  , 0.  , 0.  , 0.  , 0.  ], 
     [ 2.  , 1.63636364, 1.38461538, 1.2  , 1.05882353, 
     0.94736842, 0.85714286, 0.7826087 , 0.72  , 0.66666667]]) 
>>> uUpperDraw 
array([[ 0.  , 0.  , 0.  , 0.  , 
      0.  , 0.  , 0.  , 0.  , 
      0.  , 0.  ], 
     [ 0.  , 0.  , 0.  , 0.  , 
      0.  , 0.  , 0.  , 0.  , 
      0.  , 0.  ], 
     [ 0.  , 0.  , 0.  , 0.  , 
      0.  , 0.  , 0.  , 0.  , 
      0.  , 0.  ], 
     [ 2.  , 3.63636364, 5.02097902, 6.22097902, 
      7.27980255, 8.22717097, 9.08431383, 9.86692252, 
     10.58692252, 11.25358919], 
     [ 0.  , 0.  , 0.  , 0.  , 
      0.  , 0.  , 0.  , 0.  , 
      0.  , 0.  ]]) 

回答

5

這看起來像是累計和。當你想有每行的累積金額時,這裏可以工作

uUpperDraw = np.cumsum(W,axis=1) 
+0

是的,正是這個!我錯過了!但首先我想OP是在尋找一個python解決方案! – Kasramvd

+1

經驗法則:從不使用numpy對象上的循環。特拉維斯的內容。 –