、これはどちらか恐ろしく遅いではありませんスパース行列を構築する最速の方法ではないが、少なくともlil
割り当てステップではない:
In [204]: N=100
In [205]: M=sparse.lil_matrix((N,N))
In [206]: for i in range(N):
...: for j in range(N):
...: M[i,j]=(i==j)
In [207]: M
Out[207]:
<100x100 sparse matrix of type '<class 'numpy.float64'>'
with 100 stored elements in LInked List format>
それはM
にちょうどゼロ以外の値を保存しました。私はループ中の遅延をほとんど見かけませんでした。
だから私の推測では、ほとんどの時間はpanadas
インデックス式に費やされていることである。
np.sum(data[data['source_node']==i].destination_node.isin(data[data['source_node']==j].destination_node))
の変換データは、多くの場合、スパース行列が頻繁に来るcoocuranceカウントに、テキスト形式。それらは学習コード、パターン検索などで使用されます。scikit-learn
がよく使用されます。またtensorflow
。 = 1000
In [212]: %%timeit
...: M=sparse.lil_matrix((N,N))
...: for i in range(N):
...: for j in range(N):
...: M[i,j]=(i==j)
...:
1 loop, best of 3: 7.31 s per loop
Nについて
を反復高密度アレイにこれらの値を代入すると、我々は終わりにスパースへの変換を含む場合であっても、高速です。
In [213]: %%timeit
...: M=np.zeros((N,N))
...: for i in range(N):
...: for j in range(N):
...: M[i,j]=(i==j)
...:
1 loop, best of 3: 353 ms per loop
In [214]: %%timeit
...: M=np.zeros((N,N))
...: for i in range(N):
...: for j in range(N):
...: M[i,j]=(i==j)
...: M = sparse.lil_matrix(M)
...:
1 loop, best of 3: 353 ms per loop
非常に大きなケースでは、その中間の高密度アレイを作成すると、メモリの問題が発生する可能性があります。
私たちにあなたのコードを示すことは良いスタートになるでしょう。 10^12回の計算は無条件に高すぎます。 –
あなたのマトリックスはどれくらい希薄ですか?通常は、キーが行列座標であるという点でdictを使用するアプローチです。 – jsbueno
これはPython 2または3ですか? 2の場合は、 'range'の代わりに' xrange'を使うべきです。 –