计算3D Numpy阵列和2D Numpy阵列之间的余弦相似性



我有一个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_simurarity函数不支持3D数组的操作,因此是否有更有效的方法来计算此方法,而不涉及使用for-loop?

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

最新更新