[英]Speeding up Numpy Masking
在考慮如何優化時,我仍然是一個成熟的人。 我有這段代碼,它接收已找到的峰值列表,並找到這些峰值(+/- 某個值)在多維數組中的位置。 然后將 +1 添加到它們的零數組索引。 代碼運行良好,但執行時間較長。 例如,如果ind
有 270 個值並且refVals
的形狀為 (3050,3130,80),則運行時間接近 45 分鍾。 我知道需要處理大量數據,但是有沒有更有效的方法來解決這個問題?
maskData = np.zeros_like(refVals).astype(np.int16)
for peak in ind:
tmpArr = np.ma.masked_outside(refVals,x[peak]-2,x[peak]+2).astype(np.int16)
maskData[tmpArr.mask == False ] += 1
tmpArr = None
maskData = np.sum(maskData,axis=2)
方法#1:內存允許,這是使用broadcasting
的矢量化方法 -
# Craate +,-2 limits usind ind
r = x[ind[:,None]] + [-2,2]
# Use limits to get inside matches and sum over the iterative and last dim
mask = (refVals >= r[:,None,None,None,0]) & (refVals <= r[:,None,None,None,1])
out = mask.sum(axis=(0,3))
方法#2:如果前一個內存不足,我們可以使用循環並使用 NumPy 布爾數組,這可能比掩碼數組更有效。 此外,我們將再執行一層sum-reduction
,以便在跨迭代移動時拖動更少的數據。 因此,替代實現看起來像這樣 -
out = np.zeros(refVals.shape[:2]).astype(np.int16)
x_ind = x[ind]
for i in x_ind:
out += ((refVals >= i-2) & (refVals <= i+2)).sum(-1)
方法 #3:或者,我們可以在方法 #2 中用np.isclose
替換基於限制的比較。 因此,循環內的唯一一步將成為 -
out += np.isclose(refVals,i,atol=2).sum(-1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.