Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的Python嵌套for循环_Python_Python 3.x_Oop_For Loop_Pytorch - Fatal编程技术网

Python中的Python嵌套for循环

Python中的Python嵌套for循环,python,python-3.x,oop,for-loop,pytorch,Python,Python 3.x,Oop,For Loop,Pytorch,我正在编写这段代码,其中嵌套了for循环a_列表和b_列表是元组列表,其中每个元组由两个张量组成[(tens1,tens2),…]。我试图计算a_列表中的每个tens1与b_列表中的每个tens1的相似性。下面是我的代码。嵌套循环似乎是一个瓶颈。有没有更好的方法(pythonic)可以重新编写循环 a2b= defaultdict(dict) b2a= defaultdict(dict) ab_sim = [] for a, vec_a in a_list: for b, vec_b

我正在编写这段代码,其中嵌套了for循环
a_列表
b_列表
是元组列表,其中每个元组由两个张量组成
[(tens1,tens2),…]
。我试图计算
a_列表中的每个
tens1
b_列表中的每个
tens1
的相似性。下面是我的代码。嵌套循环似乎是一个瓶颈。有没有更好的方法(pythonic)可以重新编写循环

a2b= defaultdict(dict)
b2a= defaultdict(dict)
ab_sim = []

for a, vec_a in a_list:
    for b, vec_b in b_list:
        # Ignore combination if the first element in both a and b are same
        if a[0] == b[0]:
            continue
        # Calculate cosine similarity of combination
        sim = self.calculate_similarity(vec_a, vec_b )
        a2b[a][b] = sim
        b2a[b][a] = sim
        ab_sim.append(sim)

calculate\u similarity
只是一种计算余弦相似度的方法<代码>a_列表
b_列表
可以是任意大小。我有
b2a
a2b
,因为我需要它们进行其他计算。

你可以使用字典理解:

a2b = {a: {b: self.calculate_similarity(vec_a, vec_b )
       for (b, vec_b) in b_list if a[0] != b[0]} for (a, vec_a) in a_list}
您还可以使用:

请注意,您将得到一个具有元组索引的字典,而不是两个冗余字典

编辑:要取回这两本词典,您可以使用dict CONTRUSION:

a2b = {a: {_b:v for (_a,_b), v in result.items() if _a==a} for (a,b) in result.keys()}
b2a = {b: {_a:v for (_a,_b), v in result.items() if _b==b} for (a,b) in result.keys()}

要获得相似性值列表,可以使用
ab_sim=list(result.values())

我认为存储此信息最自然的方式是在矩阵中

从随机导入随机
将numpy作为np导入
n=3
a=[(n*np.random.rand(n)//1,n*np.random.rand(n)//1)表示范围(3)内的uu]
b=[(n*np.random.rand(n)//1,n*np.random.rand(n)//1)表示范围(3)内的uu]
相似性=λx,y:np.dot(x,y)/(np.linalg.norm(x)*np.linalg.norm(y))
sim_matrix=[[相似性(x,y)如果x[0]!=y[0]否则np.inf表示y,b]表示x,a]
打印(*sim_矩阵,sep=“\n”)
完整的代码。

如果你真的需要所有余弦相似性的完整n×m矩阵,我认为没有任何方法可以计算所有余弦相似性。如果你可以编辑你的问题来解释为什么你需要这些余弦相似性,也许我们可以避免一个。你知道你实际上是在比较第二张量吗?第一个存储在
a
中,第二个存储在
vec\u a
中,与
b
vec\u b
相同。您正在比较
vec_a
vec_b
。如果您希望
a
b
作为索引,则需要使用
枚举
。作为一个小优化,如果您将它们存储在一个具有排序元组键的dict中,则不必同时使用
a2b
b2a
。@再见,我们不知道
a_列表
/
b_列表
的形状,它们可能已经是索引了,所以我试图计算两种语言之间句子表示的余弦相似性。我有
a_list
b_list
是一个元组列表,其中每个元组都包含(句子,嵌入表示)。这仍然使用两个嵌套循环,但我认为我们无法进一步优化。@JesujobaALABI确实以前的dict理解是错误的,你现在可以检查一下吗?这次应该是正确的Nice@Itamar!我的字典不是多余的。我将它们用于我决定不包括在这里的其他计算,它们是多余的,因为它们包含相同的信息。您可以使用另一种数据结构-我建议您探索,例如,具有多索引的pandas数据帧/系列:。然而,我编辑了我的问题,以显示如果您喜欢该结构,如何从联合字典中获取这两个字典。我需要获取
sim
(相似性)添加到列表中,例如
ab_sim.append(sim)
。我需要一个单独的循环吗?不需要,这个列表只是
ab_sim=list(result.values())
,但是我添加了重要的代码,因为另一个代码只是为了模拟他在问题中已有的数据,我仍然会更新,谢谢;我没有直接删除答案,因为你的答案中显然有重要的一行。遗憾的是,你提供了更广泛的背景作为一个图像。生成的输出也只是文本,顺便说一下,输出的图像不会添加任何有用的信息。
a2b = {a: {_b:v for (_a,_b), v in result.items() if _a==a} for (a,b) in result.keys()}
b2a = {b: {_a:v for (_a,_b), v in result.items() if _b==b} for (a,b) in result.keys()}