2017-05-29 6 views
0

私は各列にSciPyスパースベクトルを含む2つの列を持つパンダデータフレームを持っています。これらのベクトルはcsr行列からの行です(実際には1x8500の行列です)。スパースベクトルで2つのパンダ列の各行間のドット積を計算する方法

同じ行の最初の2つの列からのベクトルの間にドット積を入れるべき別の列を作成する必要があります。

私は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を計算する効率的な方法はありますか?あなたの例で

+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'] DTYPEはオブジェクトであり、各要素はcsrマトリックス、mat.getrow(i)の結果です。表示は、埋め込まれたタブと改行でちょっと乱雑です。 .Aで作られた高密度相当物はよりきれいです。形は一貫していますが、非ゼロ項の数は異なります。

+0

私は行列がないのでこれを使うことはできません。私が持っているのは、Col_1とCol_2の2つのカラムです。もちろんデータフレームです。 –

+0

これまでのところ、私は単にアクションを明確にしようとしています。これらのpandasカラムから複数の疎な行列を構築することは、おそらく対で 'dot'ペアを実行することと同じくらいでしょう。真の数値配列の速度の大部分を緩和します。 – hpaulj

関連する問題