【问题标题】:How to compute dot product between each row of two pandas columns with sparse vectors如何使用稀疏向量计算两个熊猫列的每一行之间的点积
【发布时间】:2017-10-30 01:12:19
【问题描述】:

我有一个 Pandas 数据框,它有两列,每一列的每一行都包含一个 SciPy 稀疏向量。这些向量是来自 csr 矩阵的行(因此它们实际上是形状为 1x8500 的矩阵)。

我需要创建另一列,该列的每一行都应包含同一行前两列的向量之间的点积。

我知道如何在每一行上使用apply / map,但是当我处理具有数百万行的数据集时需要很长时间。有没有更快的方法在整个数据帧上执行此操作?

除了点积之外,我还需要计算余弦相似度,但据我所知,这可能来自点积。

更新:我无法在此处分享实际数据,但这是一个玩具示例(请注意,我现在只有生成的数据框):

import pandas as pd
import numpy as np
from scipy.sparse import csr_matrix
row = np.array([0, 0, 1, 2, 2, 2])
col = np.array([0, 2, 2, 0, 1, 2])
data = np.array([1, 2, 3, 4, 5, 6])
mat = csr_matrix((data, (row, col)), shape=(3, 3))
df = pd.DataFrame({'Col_1': [mat.getrow(i) for i in range(3)],
                   'Col_2': [mat.getrow(i)*2 for i in range(3)]})

我知道我可以做这样的事情来计算点积:

df['Col_3'] = df.apply(lambda row: np.dot(row['Col_1'],
                       row['Col_2'].transpose()).toarray()[0][0], axis=1)

但是有没有更有效的方法来计算Col_3

【问题讨论】:

  • 能否提供一个小的可重现样本数据集和想要的数据集?
  • 要明确一点:数据框中的项目真的是稀疏向量吗?有些东西告诉我这是次优的设计。你真的需要把熊猫带入画面吗?
  • 你的数据集有多大?
  • @AndrasDeak 严格来说,它们是仅包含一行和大约 8500 列的稀疏矩阵 (csr)。我尝试使用 pandas,因为自定义代码需要更多测试。
  • @WR 他们是几千万行。在这些结构上使用applynp.dot 让我等了几十分钟。

标签: python pandas scipy sparse-matrix dot-product


【解决方案1】:

用你的例子

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 是对象,每个元素是一个csr 矩阵,mat.getrow(i) 的结果。嵌入式标签和换行符的显示有点混乱。使用.A 生成的密集等效项更漂亮。形状是一致的,但非零项的数量会有所不同。

【讨论】:

  • 我无法使用它,因为我没有任何矩阵。我只有Col_1Col_2 这两列。当然还有数据框。
  • 到目前为止,我只是想澄清一下动作。从这些 pandas 列构造多行稀疏矩阵可能与逐对执行 dot 一样多。一旦将事物拆分为对象数组,在 numpy 或 pandas 中,你失去了真正数字数组的大部分速度。
猜你喜欢
  • 1970-01-01
  • 2019-12-27
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2018-12-25
  • 1970-01-01
相关资源
最近更新 更多