Python 如何用稀疏向量计算两列每行之间的点积
我有一个Pandas数据框架,它有两列,每列的每一行都包含一个SciPy稀疏向量。这些向量是csr矩阵中的行(因此它们实际上是1x8500形状的矩阵) 我需要创建另一列,它的每一行中都应该包含同一行前两列向量之间的点积 我知道如何在每一行上使用Python 如何用稀疏向量计算两列每行之间的点积,python,pandas,scipy,sparse-matrix,dot-product,Python,Pandas,Scipy,Sparse Matrix,Dot Product,我有一个Pandas数据框架,它有两列,每列的每一行都包含一个SciPy稀疏向量。这些向量是csr矩阵中的行(因此它们实际上是1x8500形状的矩阵) 我需要创建另一列,它的每一行中都应该包含同一行前两列向量之间的点积 我知道如何在每一行上使用apply/map,但当我处理数百万行的数据集时,这需要很长时间。有没有一种更快的方法可以在整个数据帧上实现这一点 除了点积之外,我还需要计算余弦相似性,但据我所知,这可能是从点积推导出来的 更新:我不能在这里共享实际数据,但这里有一个玩具示例(请注意,我
apply
/map
,但当我处理数百万行的数据集时,这需要很长时间。有没有一种更快的方法可以在整个数据帧上实现这一点
除了点积之外,我还需要计算余弦相似性,但据我所知,这可能是从点积推导出来的
更新:我不能在这里共享实际数据,但这里有一个玩具示例(请注意,我现在只有结果数据框):
我知道我可以这样做来计算点积:
df['Col_3'] = df.apply(lambda row: np.dot(row['Col_1'],
row['Col_2'].transpose()).toarray()[0][0], axis=1)
但是,有没有更有效的方法来计算Col_3
?与您的示例一起
matA = mat
matB = mat*2
col3 = (matA.multiply(matB)).sum(axis=1)
[[ 10]
[ 18]
[154]]
for i in range(3):
print(df['Col_1'][i].A, df['Col_2'][i].A)
[[1 0 2]] [[2 0 4]]
[[0 0 3]] [[0 0 6]]
[[4 5 6]] [[ 8 10 12]]
df['Col_1']
dtype是object,每个元素都是csr
矩阵,是mat.getrow(i)
的结果。显示屏上嵌入了标签和换行符,有点凌乱。用.A
产生的致密当量更漂亮。形状是一致的,但非零项的数量是不同的。您能提供一个小的可复制样本数据集和所需的数据集吗?请澄清:您的数据帧中的项目真的是稀疏向量吗?我觉得这是次优设计。你真的需要把熊猫带到图片中吗?你的数据集有多大?@AndrasDeak严格地说,它们是稀疏矩阵(csr),只包含一行和大约8500列。我尝试使用pandas,因为定制代码需要更多的测试。@WR它们有几千万行。在这些结构上使用apply
和np.dot
会让我等待几十分钟。我不能使用这个,因为我没有任何矩阵。我只有那两列Col_1
和Col_2
。当然还有数据帧。到目前为止,我只是想澄清一下动作。从这些熊猫列构造多行稀疏矩阵的工作量可能与成对执行点
的工作量一样大。一旦你将事物拆分为对象数组,在numpy或pandas中,你就失去了真正数字数组的大部分速度。
matA = mat
matB = mat*2
col3 = (matA.multiply(matB)).sum(axis=1)
[[ 10]
[ 18]
[154]]
for i in range(3):
print(df['Col_1'][i].A, df['Col_2'][i].A)
[[1 0 2]] [[2 0 4]]
[[0 0 3]] [[0 0 6]]
[[4 5 6]] [[ 8 10 12]]