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

Compute cosine similarity between 3D numpy array and 2D numpy array

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

对于 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 循环?

您可以重塑为 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