python发现嵌套列表中的每个元素与其他列表中的每个元素都有类似的结果,而不使用for循环

python发现嵌套列表中的每个元素与其他列表中的每个元素都有类似的结果,而不使用for循环,python,arrays,list,list-comprehension,Python,Arrays,List,List Comprehension,我有一张这样的清单 l=[[1,2,3],[4,5,6],[2,3,4],[3,5,7],[5,6,7],[6,7,8],[7,8,9]] 现在我有了另一个列表 l1=[3,6,9] 现在我想用l1计算l的每个元素的相似性,并将相似性值附加到一个空列表中 我可以用下面的代码 from sklearn.metrics.pairwise import cosine_similarity values=[] for i in l: values.append(cosine_similari

我有一张这样的清单

l=[[1,2,3],[4,5,6],[2,3,4],[3,5,7],[5,6,7],[6,7,8],[7,8,9]]
现在我有了另一个列表

l1=[3,6,9]
现在我想用l1计算l的每个元素的相似性,并将相似性值附加到一个空列表中

我可以用下面的代码

from sklearn.metrics.pairwise import cosine_similarity
values=[]
for i in l:
    values.append(cosine_similarity([i],[l1]))

上面的代码得到了我想要的结果,但是执行时间非常长。我正在寻找一些捷径,以最有效地做到这一点

您可以将所有内容都转换为2D numpy数组,然后只需应用一次
cosine\u相似度
,让形状广播处理所有内容

首先,您需要将数据转换为numpy数组

>>> l = np.array([[1,2,3],[4,5,6],[2,3,4],[3,5,7],[5,6,7],[6,7,8],[7,8,9]])
>>> l.shape
(7, 3)
同样,您还需要转换
l1
。此外,还需要将其重塑为二维阵列

>>> l1 = np.array([3,6,9])
>>> l1.shape
(3,)
>>> l1 = l1.reshape(1, -1)
>>> l1.shape
(1, 3)
现在,您可以轻松地应用余弦相似性函数

cosine_similarity(l, l1)
这将生成如下所示的数组:

array([[1.        ],
       [0.97463185],
       [0.99258333],
       [0.9974149 ],
       [0.96832966],
       [0.96337534],
       [0.95941195]])

您可以将所有内容转换为2D numpy数组,然后只需应用一次
cosine\u相似度
,让形状广播处理所有内容

首先,您需要将数据转换为numpy数组

>>> l = np.array([[1,2,3],[4,5,6],[2,3,4],[3,5,7],[5,6,7],[6,7,8],[7,8,9]])
>>> l.shape
(7, 3)
同样,您还需要转换
l1
。此外,还需要将其重塑为二维阵列

>>> l1 = np.array([3,6,9])
>>> l1.shape
(3,)
>>> l1 = l1.reshape(1, -1)
>>> l1.shape
(1, 3)
现在,您可以轻松地应用余弦相似性函数

cosine_similarity(l, l1)
这将生成如下所示的数组:

array([[1.        ],
       [0.97463185],
       [0.99258333],
       [0.9974149 ],
       [0.96832966],
       [0.96337534],
       [0.95941195]])

可以使用numpy二维数组而不是列表。下面的代码可能会有所帮助:

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

l=np.array([[1,2,3],[4,5,6],[2,3,4],[3,5,7],[5,6,7],[6,7,8],[7,8,9]])

# You need to reshape your data 
l1=np.array([3,6,9]).reshape(1, -1)

def cal_cs(arr):
    # Reshaping here also
    return cosine_similarity(l1, arr.reshape(1, 3))

list(map(lambda x: cal_cs(x), l))
我得到的结果是

[array([[1.]]),
 array([[0.97463185]]),
 array([[0.99258333]]),
 array([[0.9974149]]),
 array([[0.96832966]]),
 array([[0.96337534]]),
 array([[0.95941195]])

希望这有帮助

您可以使用numpy 2D数组而不是列表。下面的代码可能会有所帮助:

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

l=np.array([[1,2,3],[4,5,6],[2,3,4],[3,5,7],[5,6,7],[6,7,8],[7,8,9]])

# You need to reshape your data 
l1=np.array([3,6,9]).reshape(1, -1)

def cal_cs(arr):
    # Reshaping here also
    return cosine_similarity(l1, arr.reshape(1, 3))

list(map(lambda x: cal_cs(x), l))
我得到的结果是

[array([[1.]]),
 array([[0.97463185]]),
 array([[0.99258333]]),
 array([[0.9974149]]),
 array([[0.96832966]]),
 array([[0.96337534]]),
 array([[0.95941195]])

希望这能有所帮助

您是否尝试过制作numpy数组并使用广播计算余弦相似性?我想sklearn应该支持numpy和广播。你试过制作numpy数组并使用广播计算余弦相似性吗?我想sklearn应该支持numpy和广播。