2017-05-29 69 views
0

我有一個熊貓數據框,其中每列包含一個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)]}) 

我知道我可以做這樣的事情來計算dot product:

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

但是有沒有更高效的方法來計算Col_3

+0

您能提供一個小的可重現樣本數據集和一個所需的數據集嗎? – MaxU

+1

只需清楚:數據框中的項目是否真的是稀疏向量?有些事告訴我這是不理想的設計。你真的需要把熊貓帶進畫面嗎? –

+0

你的數據集有多大? –

回答

0

隨着你的例子

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'] D型細胞是對象,並且每個元件是csr矩陣,mat.getrow(i)結果。顯示內容與嵌入式製表符和換行符有點混亂。用.A生產的密集等價物更漂亮。形狀是一致的,但非零項的數量是變化的。

+0

我不能使用這個,因爲我沒有任何矩陣。我所有的就是那兩列'Col_1'和'Col_2'。當然還有數據框。 –

+0

到目前爲止,我只是想澄清一下這個行爲,從這些熊貓列中構造多行稀疏矩陣可能與一對一對地執行點一樣多,一旦你將事物分解成對象數組,在numpy或pandas中,你失去了真正數字數組的大部分速度。 – hpaulj