2016-09-28 121 views
1

我有一個numpy的陣列arr和切片的列表開始點start和切片端點end的列表。對於每行i,我想確定從start[i]end[i]的元素總和。也就是說,我想確定numpy的:計算總和(陣列[I,A [1]:B [I]])對於所有i行

[np.sum(arr[i, start[i]:end[i]]) for i in range(arr.shape[0])] 

是否有更聰明/更快的方式來使用numpy來做到這一點?

+0

我想你會想'扁平化和arr'使用['numpy.add.reduceat'(HTTP://文檔。 scipy.org/doc/numpy/reference/generated/numpy.ufunc.reduceat.html)來計算總和。 – user2357112

+0

不過,計算一堆你不需要的'arr'的其他部分會帶來不幸的效果。我不知道避免這種情況的好方法,不用寫一個明確的循環。 – user2357112

回答

3

下面是使用NumPy broadcastingnp.einsum一個量化的方法 -

# Create range array corresponding to the length of the no. of cols 
r = np.arange(arr.shape[1]) 

# Mask of ranges corresponding to the start and end indices using broadcasting 
mask = (start[:,None] <= r) & (end[:,None] > r) 

# Finally, we use the mask to select and sum rows using einsum 
out = np.einsum('ij,ij->i',arr,mask) 
+0

我喜歡這個答案! – Kasramvd

相關問題