簡體   English   中英

加速 Numpy 掩碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM