我有一个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?
答案 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