Это примерно в два раза быстрее, чем np.where
import numba as nb
@nb.njit(fastmath=True)
def get_threshold(abs_cosine,threshold):
idx=0
sim_vec=np.empty((abs_cosine.shape[0]*abs_cosine.shape[1],2),dtype=np.uint32)
for m in range(abs_cosine.shape[0]):
for n in range(abs_cosine.shape[1]):
# exclude diagonal cells
if m != n and abs_cosine[m,n] >= threshold:
sim_vec[idx,0]=m
sim_vec[idx,1]=n
idx+=1
return sim_vec[0:idx,:]
Первый вызов длится примерно 0,2 с (накладные расходы на компиляцию). Если массив находится на графическом процессоре, может также быть способ выполнить все вычисления на графическом процессоре.
Тем не менее, я не очень доволен производительностью, поскольку простая логическая операция примерно в 5 раз быстрее, чем решение, показанное выше, и в 10 раз быстрее, чем np.where. Если порядок индексов не имеет значения, эту проблему можно распараллелить.