【发布时间】:2020-01-14 12:49:38
【问题描述】:
我有以下数据框:
file_1 0.797647 ... 0.000000
file_2 0.000000 ... 0.000000
file_3 0.000000 ... 0.000000
我们称之为df。
每行都有一个索引 (file_x) 和 4096 列(没有名称)。
我还有一个大小为 4096 的向量(称为 test_file),我想计算 df 中每一行的余弦相似度。
基本思想是将结果附加到一个新列中,我可以对其进行排序以获得最好的 5 个结果。
到目前为止,我一直在使用iterrows() 在我的向量和每一行之间执行cosine_similarity 测量。
for index, row in df.iterrows():
cos_sim = cosine_similarity(row.values.reshape(1, -1), test_file)
但对于性能问题,我想使用更适合矩阵计算的 pandas 或 numpy 方法。
我正在查看使用 lambda 函数的 .apply() 或 .assign() 方法,但我不知道如何继续(所有示例都使用我没有的命名列)。
我想做类似的事情
df.assign(cos_sim = cosine_similarity(df[:], test_file))
但是如何让当前行对相似度进行操作呢?
我还使用 df["cos_dist"] = cdist(np.stack(df.vector), test_file, metric="cosine") 之类的东西从 scipy 库中调查了 cdist,但我不知道如何保留原始数据框中的索引信息。
【问题讨论】:
-
您可以使用
axis=1参数在行上应用 -
是的,但是您如何定义要应用的功能?我需要使用每行中的所有列作为向量与我的
test_file向量进行比较。 -
试试
lambda row: cosine_similarity(row.values.reshape(1, -1), test_file)