计算3D numpy数组和2D numpy数组之间的余弦相似度

时间:2018-04-22 19:59:19

标签: python numpy scikit-learn similarity cosine-similarity

我有一个3D numpy数组A形状(m,n,300)和一个2D numpy数组B形状(p,300)。

对于3D阵列中的每个m(n,300)矩阵,我想用2D numpy数组计算其余弦相似度矩阵。目前,我正在做以下事情:

result = []
for sub_matrix in A:
    result.append(sklearn.metrics.pairwise.cosine_similarity(sub_matrix, B)

sklearn cosine_similarity函数不支持使用3D数组的操作,那么是否有更有效的计算方法,不涉及使用for-loop?

1 个答案:

答案 0 :(得分:1)

您可以重塑为2D并使用相同的功能 -

from sklearn.metrics.pairwise import cosine_similarity

m,n = A.shape[:2]
out = cosine_similarity(A.reshape(m*n,-1), B).reshape(m,n,-1)

最后重塑后的输出为3D,这是result数组转换后的结果。

示例运行 -

In [336]: np.random.seed(0)
     ...: A = np.random.rand(5,4,3)
     ...: B = np.random.rand(2,3)
     ...: 
     ...: result = []
     ...: for sub_matrix in A:
     ...:     result.append(cosine_similarity(sub_matrix, B))
     ...: out_org = np.array(result)
     ...: 
     ...: from sklearn.metrics.pairwise import cosine_similarity
     ...: 
     ...: m,n = A.shape[:2]
     ...: out = cosine_similarity(A.reshape(m*n,-1), B).reshape(m,n,-1)
     ...: 
     ...: print np.allclose(out_org, out)
True