2016-10-13 1 views
2

Я по-прежнему интересен, когда речь заходит о том, как оптимизировать. У меня есть этот раздел кода, который принимает список найденных пиков и находит, где эти пики, +/- некоторое значение, находятся в многомерном массиве. Затем он добавляет +1 к их индексам массива нулей. Код работает хорошо, но выполнение занимает много времени. Например, он занимает около 45 минут для запуска, если ind имеет 270 значений, а refVals имеет форму (3050,3130,80). Я понимаю, что у него много данных, чтобы перевернуться, но есть ли более эффективный способ обойти это?Ускорение маскировки номеров

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) 

ответ

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)) 

Approach # 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: В качестве альтернативы, мы могли бы заменить, что сравнение на основе предела с np.isclose в 2 захода на посадку #. Таким образом, единственный шаг внутри петли станет следующим:

out += np.isclose(refVals,i,atol=2).sum(-1) 
+0

Подход №1 немедленно уничтожил мою память, но было бы неплохо, если бы это не так. # 2 и # 3 отлично работают. Существует резкое улучшение. благодаря – nanoPhD

Смежные вопросы