2017-05-20 18 views
0

私はこのコードの#2を可能な限り高速化しようとしています。だから、Cythonを試してみると便利かもしれないと思っていました。しかし、私はCythonで疎な行列を実装する方法がわかりません。誰かが/ CythonやおそらくJuliaでそれをもっと速くするためにそれをラップすることが可能なら、どのようにするかを示すことができますか?このPythonコードをCythonに翻訳することは可能ですか?

#1) This part computes u_dict dictionary filled with unique strings and then enumerates them. 

import scipy.sparse as sp 
import numpy as np 
from scipy.sparse import csr_matrix 

full_dict = set(train1.values.ravel().tolist() + test1.values.ravel().tolist() + train2.values.ravel().tolist() + test2.values.ravel().tolist()) 
print len(full_dict) 
u_dict= dict() 
for i, q in enumerate(full_dict): 
    u_dict[q] = i 


shape = (len(full_dict), len(full_dict)) 
H = sp.lil_matrix(shape, dtype=np.int8) 


def load_sparse_csr(filename): 
    loader = np.load(filename) 
    return csr_matrix((loader['data'], loader['indices'], loader['indptr']), 
         shape=loader['shape']) 

#2) I need to speed up this part 
# train_full is pandas dataframe with two collumns w1 and w2 filled with strings 

H = load_sparse_csr('matrix.npz') 

correlation_train = [] 
for idx, row in train_full.iterrows(): 
    if idx%1000 == 0: print idx 
    id_1 = u_dict[row['w1']] 
    id_2 = u_dict[row['w2']] 
    a_vec = H[id_1].toarray() # these vectors are of length of < 3 mil. 
    b_vec = H[id_2].toarray() 
    correlation_train.append(np.corrcoef(a_vec, b_vec)[0][1]) 
+0

参照[この質問](http://stackoverflow.com/questions/25295159/how-to-properly-pass-a-scipy-sparse-csr-matrix-to-a-cython-関数)。 –

答えて

0

私はかなりの時間前にHow to properly pass a scipy.sparse CSR matrix to a cython function?に貢献しながらcythonが進むべき道であるならば、私は疑問です。特に、numpycythonの経験がまだない場合は、 cythonは、反復計算を、numpyまたは他のpythonコードを呼び出すことなくCに変換できるコードに置き換えたときの最大のスピードアップを提供します。 pandasをミックスに投げれば、さらに大きな学習曲線が得られます。

sparseの重要な部分はすでにcythonと書かれています。

私はcythonの問題に触れることなく、私はいくつかの問題を参照してください。

H

は二度定義されています

見落とし、またはPythonの変数が作成され、割り当てられているかを理解するために失敗のいずれかです
H = sp.lil_matrix(shape, dtype=np.int8) 
H = load_sparse_csr('matrix.npz') 

。 2番目の割り当てが1番目の割り当てに置き換わります。したがって最初のものは何もしません。さらに、最初の行は空のlil行列を作成するだけです。そのようなマトリックスは繰り返し充填され得る。高速ではないが、それはlilフォーマットの意図された使用である。

第2の式は、npzファイルに保存されたデータから新しい行列を作成します。これには、numpy npzファイルと基本的なcsrマトリックス作成コードが含まれます。属性はすでにcsrの形式になっているため、cython touchのものはありません。

現在地繰り返しを持っている - しかし、パンダのデータフレームの上に:あなたは、ルックアップ辞書/配列に基づいてHの特定の行を選んでいるよう

for idx, row in train_full.iterrows(): 
    id_1 = u_dict[row['w1']] 
    a_vec = H[id_1].toarray() 

が見えます。疎マトリックスインデックスは、密行列インデックスに比べて遅い。それはHa = H.toarray()は、あなたの記憶に合う場合、

a_vec = Ha[id_1,:] 

がはるかに高速になり、です。

スパース行列からより速く行(または列)を選択するよう求められました。行の疎なデータで直接作業することができれば、より直接的なものを推薦することができます。しかし、np.corrcoefに渡すことができる密な配列が必要なので、toarrayの手順も実装する必要があります。

How to read/traverse/slice Scipy sparse matrices (LIL, CSR, COO, DOK) faster?

関連する問題