Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何用稀疏向量计算两列每行之间的点积_Python_Pandas_Scipy_Sparse Matrix_Dot Product - Fatal编程技术网

Python 如何用稀疏向量计算两列每行之间的点积

Python 如何用稀疏向量计算两列每行之间的点积,python,pandas,scipy,sparse-matrix,dot-product,Python,Pandas,Scipy,Sparse Matrix,Dot Product,我有一个Pandas数据框架,它有两列,每列的每一行都包含一个SciPy稀疏向量。这些向量是csr矩阵中的行(因此它们实际上是1x8500形状的矩阵) 我需要创建另一列,它的每一行中都应该包含同一行前两列向量之间的点积 我知道如何在每一行上使用apply/map,但当我处理数百万行的数据集时,这需要很长时间。有没有一种更快的方法可以在整个数据帧上实现这一点 除了点积之外,我还需要计算余弦相似性,但据我所知,这可能是从点积推导出来的 更新:我不能在这里共享实际数据,但这里有一个玩具示例(请注意,我

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

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

我知道如何在每一行上使用
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]]