计算 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
我有一个形状为 (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