我有两个数组,A (size = (20, 200) 和 B (size = (15, 200))。我想构造一个矩阵 C (size = (20, 15)) s.t c[i,j]存储元素 A[i] 和 B[j] 之间的余弦相似度。
我可以使用循环来做到这一点,但如果 A 和 B 是大数组,则需要很长时间。
numpy 的矢量化方式是:
import numpy as np
A = np.random.uniform(size=(20, 200))
B = np.random.uniform(size=(15, 200))
normalized_A = A / np.linalg.norm(A, axis=1)[:, np.newaxis]
normalized_B = B / np.linalg.norm(B, axis=1)[:, np.newaxis]
cosine = (normalized_A[:, np.newaxis, :] * normalized_B[np.newaxis, :, :]).sum(axis=2)
# cosine.shape
# > (20, 15)
您可以使用 scipy.spatial.distance.cosine 函数来计算两个数组之间的余弦相似度:
import numpy as np
from scipy.spatial.distance import cosine
A = np.random.rand(20, 200)
B = np.random.rand(15, 200)
C = np.zeros((20, 15))
for i in range(20):
for j in range(15):
C[i, j] = cosine(A[i], B[j])