У меня есть матрица подобия (тензор факела), которая представляет собой косинусную матрицу подобия между двумя матрицами (источником и целью). Из матрицы мне нужно получить сумму расстояния между верхним ближайшим соседом каждого источника и цели.
Затем заполните два defaultdicts
, используя приведенные выше вычисленные значения, как показано в фрагменте кода ниже
import torch
from collections import defaultdict
src2tgt = defaultdict(dict)
tgt2src = defaultdict(dict)
#similarity matrix between source and target matrix
matx = torch.Tensor([[3,2,1,7],[1,1,0,8],[0,7,1,0],[2,0,0,0],[1,5,2,1]])
#the src and tgt
src = torch.LongTensor([[1,1],[1,2],[1,3],[1,4],[1,5]])
tgt = torch.LongTensor([[2,1],[2,2],[2,3],[2,4]])
#the data above are dummy, in my actual code, they are generated by a process
similarities=[]
#I need a kinda of the sum of nearest neighbor
k = 2
nearestSrc = torch.topk(matx, k, dim=1, largest=True, sorted=False, out=None)
sumDistSource = torch.sum(nearestSrc[0], 1)
nearestTgt = torch.topk(matx, k, dim=0, largest=True, sorted=False, out=None)
sumDistTarget = torch.sum(nearestTgt[0], 0)
#finally fill default dictionary of source2target and target2source
for i in range(matx.shape[0]):
for j in range(matx.shape[1]):
src2tgt[src[i]][tgt[j]] = matx[i][j].tolist() / (sumDistSource[i].tolist() + sumDistTarget[j].tolist())
tgt2src[tgt[j]][src[i]] = matx[i][j].tolist() / (sumDistTarget[j].tolist() + sumDistSource[i].tolist())
similarities.append(matx[i][j].tolist() )
Есть ли способ оптимизировать приведенный выше код, используя генератор без создать nearestSrc
, sumDistSource
, nearestTgt
, sumDistTarget
, явно требуя меньше памяти? Или я могу также уменьшить двойной l oop?