python - 获取映射值的余弦距离的有效(不是 DataFrame.apply)方法
问题描述
这是我生成的一些数据:
import numpy as np
import pandas as pd
import scipy
import scipy.spatial
df = pd.DataFrame(
{
"item_1": np.random.randint(low=0, high=10, size=1000),
"item_2": np.random.randint(low=0, high=10, size=1000),
}
)
embeddings = {item_id: np.random.randn(100) for item_id in range(0, 10)}
def get_distance(item_1, item_2):
arr1 = embeddings[item_1]
arr2 = embeddings[item_2]
return scipy.spatial.distance.cosine(arr1, arr2)
我想申请get_distance
每一行。我可以:
df.apply(lambda row: get_distance(row["item_1"], row["item_2"]), axis=1)
但这对于大型数据集来说会非常慢。
有没有办法在不使用的情况下计算与每一行对应的嵌入的余弦相似度DataFrame.apply
?
解决方案
直接使用向量化numpy
操作要快得多:
item_1_embedded = np.array([embeddings[x]for x in df.item_1])
item_2_embedded = np.array([embeddings[x]for x in df.item_2])
cos_dist = 1 - np.sum(item_1_embedded*item_2_embedded, axis=1)/(np.linalg.norm(item_1_embedded, axis=1)*np.linalg.norm(item_2_embedded, axis=1))
(这个版本771 µs
平均在我的电脑上运行,与37.4 ms
. DataFrame.apply
,这使得纯 numpy 版本快约 50 倍)。
推荐阅读
- python - networkx 边缘返回错误的索引
- javascript - 未调用 Gulp.watch 任务(gulp 4.0.0)
- ios - 从 Files 应用程序中提取文件时,如何绕过 NSCocoaErrorDomain:257?
- python - 在树莓派问题上使用 python 线程化
- python - 有没有一种pythonic方法来遍历两个列表的差异?
- r - Dplyr:使用 rename() 重命名 tibble 中添加的列未按预期工作
- c - 如何使用 pthread 库在堆上的特定位置创建锁?
- postgresql - 关于postgresql中查询结果的问题
- powerbi - 如何从 Power BI 订阅多页 PDF 报告并按月发送?
- c++ - 使用 boost 属性树创建多节 xml